
image.png
一、基本原理解釋:
- 所有對象(包括函數(shù))都是通過
__proto__指向某個(gè)原型對象 - 所有對象(除了null)都會(huì)通過
__proto__直接或間接的指向無名的花對象。 - 每個(gè)函數(shù)都會(huì)額外具備一個(gè)
prototype的指針,指向到那個(gè)原型對象。 - 由
new 函數(shù)名()產(chǎn)生的對象,其__proto__就會(huì)指向那個(gè)原型對象。 -
原型對象所有的成員都會(huì)被指向它的那些對象訪問到(直接或間接),所以可以認(rèn)為:函數(shù)是對象的工廠。 - 針對
原型對象的讀策略是:依鏈查找,直到找到花對象;而寫策略是:直接在對象本身進(jìn)行掛載或覆蓋。
二、進(jìn)階的認(rèn)知:
- 函數(shù)自身也是對象,其
__proto__指向的對象是一個(gè)名字為Function的函數(shù)的prototype指向的對象,所以可以認(rèn)為Function是函數(shù)的工廠,可以如下描述:
var Object=new Function();
var Date=new Function();
當(dāng)然,如果是我們自定義的函數(shù)本質(zhì)上是如下方式定義的:
var Person=new Function();
傳參和函數(shù)體如下:
var Person=new Function("name","this.name=name");
- JS的設(shè)計(jì)者要完成:
Function自身是函數(shù),但也是對象的目標(biāo),所以最后提出以下設(shè)想:Function對象是是Function函數(shù)產(chǎn)生的!基于以上設(shè)想,將Function做為對象使用的__proto__指向到Function做為函數(shù)的__prototype__,完成全部的設(shè)計(jì)。