簡體   English   中英

Object.create設置__proto__而不是原型

[英]Object.create setting __proto__ but not prototype

我是使用object.create而不是經典的js方法來實現原型繼承的新手。

至少在Chrome中,我很驚訝地看到以下代碼:

var baseObject = {
test : function(){
    console.log('Child');
}
}

var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);

newObject.test();

產生此結果(模擬Web工具中的輸出):

Object {test: function, test: function} 
    test: function (){
    __proto__: Object
        test: function (){
        __proto__: Object
Parent
Child 

因此,您看到它不是在設置原型,而只是在設置“ __proto__”,我認為此設置不鼓勵使用。 您可以看到,在我的代碼中,我可以正確繼承並調用父對象,但只能使用“ __proto__”。 使用“原型”會導致錯誤(未定義)。

這里發生了什么? 我認為object.create會設置“ prototype”,因為這是標准的(或者我已經假設)。 為什么填充它並使我使用“ __proto__”

不鼓勵使用__proto__來建立原型繼承,因為這是非標准的。 這並不意味着您不能使用Object.create()來創建具有特定原型對象的新對象。

默認情況下,對象沒有.prototype屬性。 您會混淆函數的.prototype對象。

因此,如果我有這樣的功能:

function Foo() {

}

Foo函數對象具有一個.prototype屬性,該屬性引用一個對象,該對象將用作在調用構造函數時創建的所有對象的__proto__

var f = new Foo();

因此,現在f是原型鏈中帶有Foo.prototype的對象。 您可以使用Object.getPrototypeOf()進行驗證;

Object.getPrototypeOf(f) === Foo.prototype; // true

Object.create為您提供的功能是可以建立相同的原型鏈,但無需使用構造函數。 因此,這是等效的。

var f2 = Object.create(Foo.prototype);

現在,我們有了一個與原始f對象相同的設置對象。

Object.getPrototypeOf(f2) === Foo.prototype;            // true
Object.getPrototypeOf(f2) === Object.getPrototypeOf(f); // true

因此,這只是做同一件事的另一種方式。 對象及其原型鏈之間的關系是內部關系。 非標准的__proto__只是暴露了這種關系。

實例的__proto__屬性應與構造函數的 prototype屬性相同。

創建對象時,其__proto__屬性設置為引用與其內部[[Prototype]]相同的對象(即,其構造函數的prototype對象)。 將新值分配給__proto__也會更改內部[[Prototype]]屬性的值,除非對象是不可擴展的。

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/proto#Description

Object.create()設置該特定對象實例的原型。 prototype是構造函數上的一個屬性,該函數是通過使用帶有該構造函數的new運算符創建的每個實例自動分配為[[Prototype]]的對象。

__proto__是訪問特定實例的[[Prototype]]的非標准方法。 您也可以調用Object.getPrototypeOf(this)作為訪問原型的標准方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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