在javaScript中对构造函数设置原型时的有趣行为
从一个简单的尝试开始,我定义了一个构造函数并使用它创建了一个实例在javaScript中对构造函数设置原型时的有趣行为,javascript,constructor,prototype-programming,Javascript,Constructor,Prototype Programming,从一个简单的尝试开始,我定义了一个构造函数并使用它创建了一个实例myobject: function MyConstructor () {}; var myobject = new MyConstructor (); 然后,我修改了这个构造函数的prototype属性,并用它创建了另一个实例myobject1: MyConstructor.prototype = {}; var myobject1 = new MyConstructor (); 我重复了相同的过程并创建了另一个实例myobj
myobject
:
function MyConstructor () {};
var myobject = new MyConstructor ();
然后,我修改了这个构造函数的prototype
属性,并用它创建了另一个实例myobject1
:
MyConstructor.prototype = {};
var myobject1 = new MyConstructor ();
我重复了相同的过程并创建了另一个实例myobject2
:
MyConstructor.prototype = {name: '2'};
var myobject2 = new MyConstructor ();
现在,我正在测试每个实例的构造函数属性,这不是我所期望的:
myobject.constructor == MyConstructor;
//true
myobject1.constructor == MyConstructor;
//false
myobject2.constructor == MyConstructor;
//false
在查找[[prototype]]时,它彼此不同
myobject.__proto__ == myobject1.__proto__
//false
myobject2.__proto__ == myobject1.__proto__
//false
有人能解释一下当更改MyConstructor的原型属性时,MyConstructor会发生什么情况吗?当您创建构造函数时:
函数MyConstructor(){};
它已将prototype.constructor设置为MyConstructor:
MyConstructor.prototype.constructor===MyConstructor//符合事实的
当您通过
MyConstructor.prototype={foo:function(){};
然后,Original MyConstructor.prototype对象被传递的对象{foo:function(){}替换,并且此对象的属性“constructor”未设置为MyConstructor,而是设置为function对象,因为对象是绑定到由对象文字创建的所有对象的构造函数
因此,在此之后:
MyConstructor.prototype = { foo: function () {} };
MyConstructor.prototype.constructor === Object;
当您使用此构造函数创建新对象时
var foo=newmyconstructor();
然后:
foo.constructor==Object;//符合事实的
因此,要修复此问题,在覆盖prototype之后,必须更正构造函数字段:
MyConstructor.prototype={foo:function(){};
MyConstructor.prototype.constructor=MyConstructor;
然后,您的构造函数就有了具有正确构造函数字段的原型。
你也可以写:
MyConstructor.prototype={foo:function(){},构造函数:MyConstructor};
最终的效果将是一样的。建造师被保存在原型中。通过使用{}销毁原型,可以有效地删除对构造函数的任何引用