从简单的尝试开始,我定义了一个构造函数并用它来创建一个实例myobject
:
function MyConstructor () {};
var myobject = new MyConstructor ();
然后,我修改了此构造函数的prototype
属性,并用它创建了另一个实例myobject1
:
MyConstructor.prototype = {};
var myobject1 = new MyConstructor ();
我重复了相同的过程并创建了另一个实例myobject2
:
MyConstructor.prototype = {name: '2'};
var myobject2 = new MyConstructor ();
现在我正在测试每个实例的constructor
属性,这不是我所期望的:
myobject.constructor == MyConstructor;
//true
myobject1.constructor == MyConstructor;
//false
myobject2.constructor == MyConstructor;
//false
查找[[原型]]时,它们彼此不同。
myobject.__proto__ == myobject1.__proto__
//false
myobject2.__proto__ == myobject1.__proto__
//false
有人可以解释在更改MyConstructor
属性时prototype
会发生什么变化吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
创建构造函数时:
function MyConstructor() {};
它将prototype.constructor设置为MyConstructor:
MyConstructor.prototype.constructor === MyConstructor; //true
当您通过
覆盖MyConstructor的原型时MyConstructor.prototype = { foo: function () {} };
然后origignal MyConstructor.prototype对象被传递的对象{foo:function(){}}替换,并且此对象没有将属性“constructor”设置为MyConstructor而是设置为Object,因为Object是绑定到所有创建的对象的构造函数对象文字。
所以在此之后:
MyConstructor.prototype = { foo: function () {} };
MyConstructor.prototype.constructor === Object;
当您使用此构造函数
创建新对象时var foo = new MyConstructor();
然后:
foo.constructor === Object; // true
所以要修复这个问题,在覆盖原型后你必须纠正构造函数字段:
MyConstructor.prototype = { foo: function () {} };
MyConstructor.prototype.constructor = MyConstructor;
然后你的构造函数有正确的构造函数字段的原型。 你也可以写:
MyConstructor.prototype = { foo: function () {}, constructor: MyConstructor };
并且最终效果将是相同的。
答案 2 :(得分:0)
构造函数保存在原型中。通过使用{}销毁原型,您可以有效地删除对构造函数的任何引用。