2

从我对原型的阅读中,我的印象是对构造函数原型的更改将反映在使用该构造函数创建的所有对象中。

考虑这段代码:

var Class1 = function(){
    this.prop1 = 'value1';
};
Class1.prototype.prop2 = 'value2';

var Class2 = function(){
    this.prop3 = 'value3';
};

//Class2.prototype = new Class1(); //1*
var obj1 = new Class2();
Class2.prototype = new Class1(); //2*

console.log('1 ' + obj1.prop1); // undefined
console.log('2 ' + obj1.prop2); // undefined
console.log('3 ' + obj1.prop3); // value3

如您所见,因为我在构造 obj1 后将 Class1 原型分配给 Class2,所以 prop1 和 prop2 的值返回“未定义”。
如果取消注释 1* 并注释掉 2*,则结果与预期一致。

在过去的几天里,我读了很多关于原型的文章,没有人提到顺序很重要。

4

1 回答 1

1

好吧,当然顺序很重要,因为new键盘强制 ECMAscript 返回一个新创建Object的,它prototype绑定到任何父对象。因此,当您创建“Class”对象的实例时(术语 Class 在 ECMAscript 中根本没有位置),引擎必须知道原型链。

于 2012-04-27T09:57:07.737 回答