最詳盡的 JS 原型與原型鏈終極詳解,沒有「可能是」。(二)

第三篇已更新,點擊進入

四. __proto__

JS 在創(chuàng)建對象(不論是普通對象還是函數(shù)對象)的時候,都有一個叫做__proto__ 的內(nèi)置屬性,用于指向創(chuàng)建它的構(gòu)造函數(shù)的原型對象。
對象 person1 有一個 __proto__屬性,創(chuàng)建它的構(gòu)造函數(shù)是 Person,構(gòu)造函數(shù)的原型對象是 Person.prototype ,所以:
person1.__proto__ == Person.prototype

請看下圖:


《JavaScript 高級程序設(shè)計》的圖 6-1

根據(jù)上面這個連接圖,我們能得到:

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;

不過,要明確的真正重要的一點就是,這個連接存在于實例(person1)與構(gòu)造函數(shù)(Person)的原型對象(Person.prototype)之間,而不是存在于實例(person1)與構(gòu)造函數(shù)(Person)之間。

注意:因為絕大部分瀏覽器都支持__proto__屬性,所以它才被加入了 ES6 里(ES5 部分瀏覽器也支持,但還不是標(biāo)準(zhǔn))。

五. 構(gòu)造器

熟悉 Javascript 的童鞋都知道,我們可以這樣創(chuàng)建一個對象:
var obj = {}
它等同于下面這樣:
var obj = new Object()

obj 是構(gòu)造函數(shù)(Object)的一個實例。所以:
obj.constructor === Object
obj.__proto__ === Object.prototype

新對象 obj 是使用 new 操作符后跟一個構(gòu)造函數(shù)來創(chuàng)建的。構(gòu)造函數(shù)(Object)本身就是一個函數(shù)(就是上面說的函數(shù)對象),它和上面的構(gòu)造函數(shù) Person 差不多。只不過該函數(shù)是出于創(chuàng)建新對象的目的而定義的。所以不要被 Object 嚇倒。


同理,可以創(chuàng)建對象的構(gòu)造器不僅僅有 Object,也可以是 Array,Date,F(xiàn)unction等。
所以我們也可以構(gòu)造函數(shù)來創(chuàng)建 Array、 Date、Function

var b = new Array();
b.constructor === Array;
b.__proto__ === Array.prototype;

var c = new Date(); 
c.constructor === Date;
c.__proto__ === Date.prototype;

var d = new Function();
d.constructor === Function;
d.__proto__ === Function.prototype;

這些構(gòu)造器都是函數(shù)對象:

函數(shù)對象

六. 原型鏈

小測試來檢驗一下你理解的怎么樣:

  1. person1.__proto__ 是什么?
  2. Person.__proto__ 是什么?
  3. Person.prototype.__proto__ 是什么?
  4. Object.__proto__ 是什么?
  5. Object.prototype__proto__ 是什么?

答案:
第一題:
因為 person1.__proto__ === person1 的構(gòu)造函數(shù).prototype
因為 person1的構(gòu)造函數(shù) === Person
所以 person1.__proto__ === Person.prototype

第二題:
因為 Person.__proto__ === Person的構(gòu)造函數(shù).prototype
因為 Person的構(gòu)造函數(shù) === Function
所以 Person.__proto__ === Function.prototype

第三題:
Person.prototype 是一個普通對象,我們無需關(guān)注它有哪些屬性,只要記住它是一個普通對象。
因為一個普通對象的構(gòu)造函數(shù) === Object
所以 Person.prototype.__proto__ === Object.prototype

第四題,參照第二題,因為 Person 和 Object 一樣都是構(gòu)造函數(shù)

第五題:
Object.prototype 對象也有proto屬性,但它比較特殊,為 null 。因為 null 處于原型鏈的頂端,這個只能記住。
Object.prototype.__proto__ === null

好了,如果以上你都能明白,那就可以繼續(xù)深入學(xué)習(xí)第三篇教程了:
第三篇,點擊進入

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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