基本看過高程等書的人都可以對原型繼承,原型鏈查找侃侃而談,代碼中也可以使用原型完成一些事情,但是,我們對于原型真的徹底搞明白了么?
原型由構(gòu)造器確定
我們的原型是一個(gè)對象,構(gòu)造器函數(shù)有一個(gè)屬性指向這個(gè)對象,prototype;而我們每次new出來的實(shí)例也有一個(gè)屬性指向這個(gè)對象,__proto__。為什么說原型是由構(gòu)造器確定的,因?yàn)樵趎ew之后,這個(gè)實(shí)例的原型就已經(jīng)確定了,實(shí)例的__proto__和構(gòu)造器的prototype都會指向那個(gè)原型對象。
var Person=function(){};var p=new Person(); console.log(p.__proto__===Person.prototype); // truePerson.prototype={ say:function(){ console.log("hello"); } }var t=new Person(); console.log(t.__proto__===Person.prototype); // truet.say(); // helloconsole.log(p.__proto__===Person.prototype); // falsep.say(); // 報(bào)錯(cuò)
這段代碼就很好的說明了這個(gè)問題。實(shí)例p通過構(gòu)造器函數(shù)Person創(chuàng)建出來(new)之后,它的__proto__和Person的prototype指向同一個(gè)對象,所以console的時(shí)候相等。然后,我們改變一下構(gòu)造器函數(shù)Person的原型指向,并創(chuàng)建了一個(gè)實(shí)例t,我們發(fā)現(xiàn)t的__proto__和Person的prototype的指向依舊是一致的,但是因?yàn)镻erson.prototype已經(jīng)改變了,而p.__proto__依舊指向原來的原型對象,所以p.__proto__和現(xiàn)在的Person.prototype指向的對象并不是同一個(gè),會返回false。證據(jù)就是p.say()會報(bào)錯(cuò),但是t.say()可以返回正確的值。
原型鏈查找,是通過實(shí)例的屬性
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26