在javaScript中的Constructor上设置原型时的迷人行为

时间:2011-11-24 10:30:38

标签: javascript constructor prototype-programming

从简单的尝试开始,我定义了一个构造函数并用它来创建一个实例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会发生什么变化吗?

3 个答案:

答案 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)

构造函数保存在原型中。通过使用{}销毁原型,您可以有效地删除对构造函数的任何引用。