JavaScript 對象是動態的屬性“包”(指其自己的屬性)。JavaScript 對象有一個指向一個原型對象的鏈。當試圖訪問一個對象的屬性時,它不僅僅在該對象上搜尋,還會搜尋該對象的原型,以及該對象的原型的原型,依次層層向上搜索,直到找到一個名字匹配的屬性或到達原型鏈的末尾。 遵循ECMAScr ...
JavaScript 對象是動態的屬性“包”(指其自己的屬性)。JavaScript 對象有一個指向一個原型對象的鏈。當試圖訪問一個對象的屬性時,它不僅僅在該對象上搜尋,還會搜尋該對象的原型,以及該對象的原型的原型,依次層層向上搜索,直到找到一個名字匹配的屬性或到達原型鏈的末尾。
遵循ECMAScript標準,someObject.[[Prototype]]
符號是用於指向 someObject
的原型。從 ECMAScript 6 開始,[[Prototype]]
可以通過Object.getPrototypeOf()和Object.setPrototypeOf()訪問器來訪問。這個等同於 JavaScript 的非標準但許多瀏覽器實現的屬性 __proto__
。
但它不應該與構造函數 func
的 prototype
屬性相混淆。被構造函數創建的實例對象的 [[prototype]]
指向 func
的 prototype
屬性。Object.prototype
屬性表示的Object原型對象。
這裡演示當嘗試訪問屬性時會發生什麼:
// 讓我們假設我們有一個對象 o, 其有自己的屬性 a 和 b: // {a: 1, b: 2} // o 的 [[Prototype]] 有屬性 b 和 c: // {b: 3, c: 4} // 最後, o.[[Prototype]].[[Prototype]] 是 null. // 這就是原型鏈的末尾,即 null, // 根據定義,null 沒有[[Prototype]]. // 綜上,整個原型鏈如下: // {a:1, b:2} ---> {b:3, c:4} ---> null console.log(o.a); // 1 // a是o的自身屬性嗎?是的,該屬性的值為1 console.log(o.b); // 2 // b是o的自身屬性嗎?是的,該屬性的值為2 // 原型上也有一個'b'屬性,但是它不會被訪問到.這種情況稱為"屬性遮蔽 (property shadowing)" console.log(o.c); // 4 // c是o的自身屬性嗎?不是,那看看原型上有沒有 // c是o.[[Prototype]]的屬性嗎?是的,該屬性的值為4 console.log(o.d); // undefined // d是o的自身屬性嗎?不是,那看看原型上有沒有 // d是o.[[Prototype]]的屬性嗎?不是,那看看它的原型上有沒有 // o.[[Prototype]].[[Prototype]] 為 null,停止搜索 // 沒有d屬性,返回undefined
原文的鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain