Преимущества установки свойства конструктора в прототипе

В наследовании прототипов JavaScript, какова цель добавления свойства prototype.constructor. Позвольте мне объяснить на примере.

var Super = function() {
    this.superProperty = 'Super Property'
}
var Sub = function() {
    this.subProperty = 'Sub Property'
}

Sub.prototype = new Super();
Sub.prototype.constructor = Sub; // advantages of the statement

var inst = new Sub();

Следующие строки всегда возвращают значение true во всех случаях, при добавлении Sub.prototype.constructor = Sub или нет.

console.log(inst instanceof Sub)   // true
console.log(inst instanceof Super) // true

Думаю, это может быть полезно при получении новых экземпляров, но когда и / или как?

Заранее спасибо.


person Fatih Acet    schedule 09.02.2011    source источник


Ответы (1)


Просто нужно правильно сбросить свойство constructor, чтобы точно отразить функцию, используемую для создания объекта.

Sub.prototype = new Super();

console.log(new Sub().constructor == Sub);
// -> 'false' 

Sub.prototype.constructor = Sub;
console.log(new Sub().constructor == Sub);
// -> 'true' 
person Andy E    schedule 09.02.2011
comment
Каковы именно последствия его невыполнения? Или, другими словами, когда значение Sub.prototype.constructor действительно имеет значение? Похоже, что это вообще не влияет на создание экземпляров Sub, afaics. Это должно быть одна из тех вещей, которые настолько очевидны, что на самом деле никто не заявляет об этом прямо, и поэтому это ускользнуло от меня :-) - person Yetanotherjosh; 30.07.2013
comment
@Yetanotherjosh: ну, в случае кода OP, если он оставит эту строку, тогда inst.constructor === Super, даже если он был создан с помощью new Sub(). Как правило, это не будет проблемой, если вас не волнует это свойство, но если вы делитесь экземпляром с другим кодом, в некоторых случаях вы можете вызвать путаницу, в том числе там, где new inst.constructor() фактически приведет к экземпляру Super(), а не Sub() (поэтому будут отсутствовать свойства, исключительные для Sub.prototype). tl; dr, это хорошая практика программирования. - person Andy E; 30.07.2013