[英]New JavaScript prototype changes constructor
當你創建一個對象與構造它有一個constructor
屬性指向構造函數:
var Foo = function(foo) {
this.foo = foo;
}
var myFoo = new Foo(123);
myFoo.constructor === Foo; // true
創建此對象后,我可以更改Foo.prototype
...
Foo.prototype.x = 'y';
...或重新分配一個新的原型對象:
Foo.prototype = {
num: 99
};
myFoo.constructor === Foo; // still true
但是,如果在將新對象分配給Foo.prototype
之后創建新的Foo對象,則其構造函數會突然指向Object
:
var myBar = new Foo(321);
myBar.constructor === Foo; // false
myBar.constructor === Object; // wtf?!
向原型添加新屬性不會產生這種效果,您必須進行賦值Foo.prototype = {...}
。
我不知道為什么創建一個新的原型會影響構造函數的屬性。 我在Chrome,Firefox和Internet Explorer中進行了測試,所有結果均相同。 有人可以幫我理解嗎?
任何對象的constructor
屬性均從該對象的原型繼承。
使用任何函數創建的默認prototype
對象都包含一個constructor
屬性,該屬性引用該函數,如spec中所述。
您的新prototype
對象不具有該constructor
屬性,而是具有自Object.prototype
繼承的其自己的constructor
屬性。
把它們加起來:
myFoo.constructor
實際上是myFoo.__proto__.constructor
。 myFoo.x
的值為"y"
但是myFoo.num
是undefined
。 constructor
。 因此他們繼承了它。 在上面的示例中, myBar.constructor
實際上是指向Object
myBar.__proto__.__proto__.constructor
。 如果從對象文字分配新原型,則只需設置構造函數屬性即可:
var Foo = function(foo) {
this.foo = foo;
};
var myFoo = new Foo(123);
Foo.prototype = {
num: 99,
constructor: Foo
};
var myBar = new Foo(99);
myBar.constructor === myFoo.constructor; // true
或者,更准確地說:
Foo.prototype = {
num: 99
};
Object.defineProperty(Foo.prototype, "constructor", {
writable: true,
configurable: true,
enumerable: false,
value: Foo
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.