js的完整原型鏈?zhǔn)疽鈭D

原型鏈?zhǔn)疽鈭D.png

1.內(nèi)置構(gòu)造函數(shù)的prototype都指向自己的prototype,然后再proto指向了Object.prototype
2.Object.create(a)的作用是:如果a是函數(shù),那么作用就是內(nèi)部新的構(gòu)造函數(shù)的prototype(新對象的proto)指向這個a,如果a是一個對象,那么就是內(nèi)部新的構(gòu)造函數(shù)(新對象的proto)指向這個a對象

總結(jié):無論是自定義的構(gòu)造函數(shù)還是內(nèi)置的構(gòu)造函數(shù),他們的prototype都指向了一個新的對象,這個對象就叫構(gòu)造函數(shù).prototype,這個東西就是一個實例對象,他的proto全都會指向Object.prototype,可以看做,你們這些構(gòu)造函數(shù)的原型,全部都繼承了Object.prototype,然后這個Object.prototype對象的proto是指向null的,他的constructor就是指向Object了。(不光是上面圖中提到的那些Array之類的,String也是一樣,尤其注意proto是雙下劃綫,String.prototype.proto === Object.prototype)
也就是說,所有的對象最后都proto繼承自O(shè)bject.prototype
另外,構(gòu)造函數(shù)無論是自定義的還是內(nèi)置的,他都有prototype和proto兩個屬性,prototype當(dāng)然指向自己的原型,就是一個對象,但是proto都是指向的Function.prototype的,因為他們都是Function的實例對象

3.借用該原型鏈圖講一下new指令的自定義
new指令發(fā)生了四個事情
a.先創(chuàng)建一個空對象
b.將空對象的原型指向構(gòu)造函數(shù)的prototype
c.將this指向新創(chuàng)建的對象
d.執(zhí)行構(gòu)造函數(shù)的代碼,然后返回新對象

function Foo(name,age) {
    this.name = name;
    this.age = age;
}

//myNewObj是用create方法,加apply自己模擬出來的
let myNewObj = Object.create(Foo.prototype);
Foo.apply(myNewObj,['張三',24])

//newObj是直接用new指令直接弄出來的
let newObj = new Foo('張三',24)
//相當(dāng)于設(shè)置了newObj.__proto__ = constructor.prototype

上面代碼中newObj是直接new出來的,myNewObj是自己做出來的,Object.create的作用就是完成a和b兩步,apply完成的是c和d兩步。
為什么要設(shè)置Object.create(Foo.prototype)呢?
答:create的作用是在內(nèi)部創(chuàng)建一個構(gòu)造函數(shù),構(gòu)造函數(shù)的prototype是指向了傳入對象的,你希望構(gòu)建出來的實例對象的proto屬性指向誰,就需要把參數(shù)設(shè)置為誰,這里明顯想要模擬這個對象是Foo創(chuàng)建出來的(new出來的),所以當(dāng)然是Foo.prototype,如果是Foo的話,那創(chuàng)建出來的對象的proto就是指向了Foo,那他就是指向Foo的那個create內(nèi)部構(gòu)造函數(shù)創(chuàng)建出來的了,這樣就不能起到模擬是Foo新建出來的目的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容