簡體   English   中英

澄清:Javascript原型更新混亂

[英]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]]內部屬性中繼承了對象的屬性。

創建實例時設置該屬性:

13.2.2 [[Construct]]

  • proto為使用參數"prototype"調用F的[[Get]]內部屬性的值。
  • 如果Typeproto )是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM