[英]Why Object.create polyfill using prototype of Function instead of simple __proto__ of Object?
[英]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]]
屬性的值,除非對象是不可擴展的。
Object.create()
設置該特定對象實例的原型。 prototype
是構造函數上的一個屬性,該函數是通過使用帶有該構造函數的new
運算符創建的每個實例自動分配為[[Prototype]]的對象。
__proto__
是訪問特定實例的[[Prototype]]的非標准方法。 您也可以調用Object.getPrototypeOf(this)作為訪問原型的標准方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.