JS 在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__
的內置屬性,用於指向建立它的構造函數的原型對象。
對象 person1 有一個 __proto__
屬性,建立它的構造函數是 Person,構造函數的原型對象是 Person.prototype ,因此:
person1.__proto__ == Person.prototype
javascript
請看下圖:java
根據上面這個鏈接圖,咱們能獲得:瀏覽器
Person.prototype.constructor == Person; person1.__proto__ == Person.prototype; person1.constructor == Person;
不過,要明確的真正重要的一點就是,這個鏈接存在於實例(person1
)與構造函數(Person
)的原型對象(Person.prototype
)之間,而不是存在於實例(person1
)與構造函數(Person
)之間。函數
注意:由於絕大部分瀏覽器都支持__proto__屬性,因此它才被加入了 ES6 裏(ES5 部分瀏覽器也支持,但還不是標準)。測試
熟悉 Javascript 的童鞋都知道,咱們能夠這樣建立一個對象:
var obj = {}
它等同於下面這樣:
var obj = new Object()
ui
obj 是構造函數(Object)的一個實例。因此:
obj.constructor === Object
obj.__proto__ === Object.prototype
spa
新對象 obj 是使用 new 操做符後跟一個構造函數來建立的。構造函數(Object)自己就是一個函數(就是上面說的函數對象),它和上面的構造函數 Person 差很少。只不過該函數是出於建立新對象的目的而定義的。因此不要被 Object 嚇倒。prototype
同理,能夠建立對象的構造器不單單有 Object,也能夠是 Array,Date,Function等。
因此咱們也能夠構造函數來建立 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;
這些構造器都是函數對象:code
小測試來檢驗一下你理解的怎麼樣:
person1.__proto__
是什麼?Person.__proto__
是什麼?Person.prototype.__proto__
是什麼?Object.__proto__
是什麼?Object.prototype__proto__
是什麼?答案:
第一題:
由於 person1.__proto__ === person1 的構造函數.prototype
由於 person1的構造函數 === Person
因此 person1.__proto__ === Person.prototype
第二題:
由於 Person.__proto__ === Person的構造函數.prototype
由於 Person的構造函數 === Function
因此 Person.__proto__ === Function.prototype
第三題:
Person.prototype
是一個普通對象,咱們無需關注它有哪些屬性,只要記住它是一個普通對象。
由於一個普通對象的構造函數 === Object
因此 Person.prototype.__proto__ === Object.prototype
第四題,參照第二題,由於 Person 和 Object 同樣都是構造函數
第五題:
Object.prototype
對象也有proto屬性,但它比較特殊,爲 null 。由於 null 處於原型鏈的頂端,這個只能記住。
Object.prototype.__proto__ === null