標籤:自己 zh-cn lin cts 表示 log 查看 ext web
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} ---> nullconsole.log(o.a); // 1// a是o的自身屬性嗎?是的,該屬性的值為1console.log(o.b); // 2// b是o的自身屬性嗎?是的,該屬性的值為2// 原型上也有一個‘b‘屬性,但是它不會被訪問到.這種情況稱為"屬性遮蔽 (property shadowing)"console.log(o.c); // 4// c是o的自身屬性嗎?不是,那看看原型上有沒有// c是o.[[Prototype]]的屬性嗎?是的,該屬性的值為4console.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
JavaScript 基於原型鏈的繼承