1

1.

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {protest:"maizere"};

[ myobject instanceof MyConstructor,     // false !
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ]           // true
console.log(myobject.protest)          //undefined

这证明 myobject 不再从 MyConstructor 原型继承属性和方法。

但请参阅下面的代码:

2.

function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype.protest= "Maizere";//Do this line gets hoisted?or something else

[ myobject instanceof MyConstructor,     // true!
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ]           // true
console.log(myobject.protest)          //Maizere

为什么会发生这种情况?内部原型的确切定义是什么?这也证明即使在对象实例化之后,proto也引用了 MyConstructor 原型。如果是这样,那么为什么第一个(1.)代码没有引用 MyConstructor 原型?由于属性是在第二个代码中的对象实例化之后添加的,并且对象的内部原型接收它,这意味着我们可以稍后更改原型属性,仍然可以在实例中看到效果。但是相同的定义不起作用在第一个代码中替换原型属性时?

4

3 回答 3

1

我可能对此有误,但是当您这样做时,它看起来像:

MyConstructor.prototype = {protest:"maizere"};

您正在使用匿名对象定义覆盖您的原型,因此当您添加一个新属性时,例如:

MyConstructor.prototype.protest= {"Maizere"};

你的类保留了它的原型,它就像一个魅力。

于 2013-01-31T03:48:21.513 回答
0

MyConstructor.prototype =覆盖整个prototype对象。

运算符测试对象的instanceof原型链中是否具有构造函数的原型属性

http://jsfiddle.net/ExplosionPIlls/xtqhp/

function MyConstructor () {}
MyConstructor.prototype = {'xyz': 'zyx'};
//true
console.log((new MyConstructor) instanceof MyConstructor);

function MyConstructor2 () {}
var mc2 = new MyConstructor2;
MyConstructor2.prototype = {'xyz': 'zyx'};
//false
console.log(mc2 instanceof MyConstructor2);

顺便说一句,MyConstructor.prototype.protest = {"Maizere"};不是有效的语法。

于 2013-01-31T03:48:56.367 回答
0

所以,这是我将这篇文章加入书签的原因之一:

被认为有点令人困惑的构造函数

基本上,第一个代码块中发生的事情是您正在用一个新对象覆盖 MyConstructor 的原型对象。而在第二个块中,您正在向现有原型对象添加一个属性。

于 2013-01-31T03:50:01.930 回答