2011-11-24 1 views
0

Начните с простой попыткой, я определил конструктор и использовать его для создания экземпляра myobject:Интригующего поведение при установке на прототип конструктора в JavaScript

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 

При поиске [[Prototype]], она отличается друг от друга.

myobject.__proto__ == myobject1.__proto__ 
//false 
myobject2.__proto__ == myobject1.__proto__ 
//false 

Может кто-нибудь объяснить, что происходит с MyConstructor при изменении его свойства prototype?

ответ

0

При создании конструктора:

function MyConstructor() {}; 

он prototype.constructor установлен в MyConstructor:

MyConstructor.prototype.constructor === MyConstructor; //true 

Когда вы перезаписать прототип MyConstructor по

MyConstructor.prototype = { foo: function() {} }; 

then 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 }; 

и конечный эффект будет тот же.

0

Конструктор хранится в прототипе.Уничтожив прототип с помощью {}, вы удалите любую ссылку на конструктор.