При создании конструктора:
function MyConstructor() {};
для его объекта prototype.constructor установлено значение MyConstructor:
MyConstructor.prototype.constructor === MyConstructor; //true
При перезаписи прототипа MyConstructor на
MyConstructor.prototype = { foo: function () {} };
затем оригинальный объект 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 };
и конечный эффект будет таким же.