這次接著上篇跟小編一起來看看JS原型和原型鏈以及注意事項有哪些,以下就是實戰案例,一起來看一下。
四. __proto__
JS 在創建物件(不論是普通物件還是函數物件)的時候,都有一個叫做__proto__ 的內建屬性,用於指向創建它的建構函數的原型物件。
物件person1 有一個__proto__屬性,建立它的建構子是Person,建構子的原型物件是Person.prototype ,所以:
person1.__proto__ == Person.prototype
請看下圖:
根據上面這個連結圖,我們能得到:
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()obj 是建構子(Object)的一個實例。所以:
obj.constructor === Object obj.__proto__ === Object.prototype新物件 obj 是使用 new 運算子後面接著一個建構函式來建立的。建構子(Object)本身就是一個函數(就是上面說的函數物件),它和上面的建構子 Person 差不多。只不過該函數是出於創建新物件的目的而定義的。所以不要被 Object 嚇倒。 同理,可以建立物件的建構器不只有 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;這些建構子都是函式物件:
小測試來檢驗你理解的怎麼樣:
person1.__proto__ 是什麼?
Person.__proto__ 是什麼?
Person.prototype.__proto__ 是什麼?
Object.__proto__ 是什麼?
Object.prototype__proto__ 是什麼?
答案:
第一題:因為person1.__proto__ === person1 的建構子.prototype
因為person1的建構子=== Person
所以person1.__proto__ === Person.prototype
第二題:
因為Person的建構子=== Function
所以Person. __proto__ === Function.prototype
第三題:
因為一個普通物件的建構子=== Object
所以Person.prototype.__proto__ === Object.prototype
第四題,參考第二題,因為Person 和Object 一樣都是建構子
第五題:
Object.prototype 物件也有proto屬性,但它比較特殊,為null 。因為 null 處於原型鏈的頂端,這個只能記住。Object.prototype.__proto__ === null
以上是詳解JS原型和原型鏈(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!