繁体   English   中英

javascript原型对象

[英]javascript prototype object

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原型,这也证明了事实;如果这样,为什么first(1。)代码未引用MyConstructor原型呢? 由于该属性是在第二个代码中的对象实例化之后添加的,并且该对象的内部原型已接收到该属性,因此这意味着我们可以稍后更改原型属性,并仍然在实例中看到效果。但是相同的定义不起作用在第一个代码中替换原型属性时?

我对此可能是错的,但是当您这样做时:

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

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

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

您的课程保留其原型,并且像一个魅力一样工作。

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

因此,这是我将本文添加为书签的原因之一:

建设者被视为轻度混乱

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM