基本看過高程等書的人都可以對原型繼承,原型鏈查找侃侃而談,代碼中也可以使用原型完成一些事情,但是,我們對于原型真的徹底搞明白了么?

原型由構造器確定

我們的原型是一個對象,構造器函數(shù)有一個屬性指向這個對象,prototype;而我們每次new出來的實例也有一個屬性指向這個對象,__proto__。為什么說原型是由構造器確定的,因為在new之后,這個實例的原型就已經(jīng)確定了,實例的__proto__和構造器的prototype都會指向那個原型對象。

photoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設計培訓,網(wǎng)站建設培訓

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();  // 報錯

photoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設計培訓,網(wǎng)站建設培訓

這段代碼就很好的說明了這個問題。實例p通過構造器函數(shù)Person創(chuàng)建出來(new)之后,它的__proto__和Person的prototype指向同一個對象,所以console的時候相等。然后,我們改變一下構造器函數(shù)Person的原型指向,并創(chuàng)建了一個實例t,我們發(fā)現(xiàn)t的__proto__和Person的prototype的指向依舊是一致的,但是因為Person.prototype已經(jīng)改變了,而p.__proto__依舊指向原來的原型對象,所以p.__proto__和現(xiàn)在的Person.prototype指向的對象并不是同一個,會返回false。證據(jù)就是p.say()會報錯,但是t.say()可以返回正確的值。

原型鏈查找,是通過實例的屬性

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設計培訓,網(wǎng)站建設培訓學習是年輕人改變自己的最好方式