javascript原型对象

时间:2013-01-31 03:40:11

标签: javascript

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原型? 因为在第二个代码中对象的实例化之后添加属性并且对象的内部原型接收它,这意味着我们可以稍后更改原型属性并仍然在实例中看到效果。但是相同的定义不起作用什么时候在第一个代码中替换原型属性?

3 个答案:

答案 0 :(得分:1)

我可能错了,但看起来就像你做的那样:

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

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

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

你的班级保留其原型,它就像一个魅力。

答案 1 :(得分:0)

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

  

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

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"};不是有效的语法。

答案 2 :(得分:0)

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

Constructors Considered Mildly Confusing

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