[英]Clarification: Javascript prototype update confusion
可能的答案 ,但答案顯示觀察到的內容,但不能解釋為什么會這樣發生。
讓我們創建三個函數構造函數。
function A() {
}
function B() {
}
function C() {
}
C.prototype.nm = "C";
B.prototype = new A()
var obj = new B()
B.prototype = new C()
console.log(obj.nm); // prints, undefined.
因此,在最后一行之后,我期望'obj'從C原型接收屬性,但事實並非如此。 這是否意味着一旦創建了對象,它便會綁定到在創建過程中分配的任何原型? 為什么這樣,我的意思是我可以通過原型接收對象的實時更新,但是如果僅更改構造函數的原型屬性就可以從多個對象獲取更新,那不是更好嗎?
您沒有為B分配任何特定的原型屬性,因此繼承鏈斷開了。
這是否意味着一旦創建了對象,它就會與創建過程中分配的任何原型綁定在一起?
對,就是這樣。 對象從其[[Prototype]]內部屬性中繼承了對象的屬性。
創建實例時設置該屬性:
- 令proto為使用參數
"prototype"
調用F的[[Get]]內部屬性的值。- 如果Type ( proto )是Object,則將obj的[[Prototype]]內部屬性設置為proto 。
但是,如果更改構造函數的prototype
屬性,它將不會影響以前的實例。
實際上, prototype
本身並不特殊,只是[[Construct]]內部方法在創建實例時使用它。
一旦創建了對象,就將其綁定到在創建過程中分配的任何原型?
通常是的。 您可以使用以下方法進行更改,但不建議這樣做(由於性能問題):
__proto__
:這是Object.prototype
的非標准屬性,可以用作[[Prototype]]的獲取器或設置器。 ECMAScript的6 標准化的IT附件B(附加功能的ECMAScript為Web瀏覽器)。
Object.setPrototypeOf
,這是ECMAScript 6引入的新方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.