Я смотрел выступления Дугласа Крокфорда в YUI Theater, и у меня есть вопрос о наследовании JavaScript ...
Дуглас приводит этот пример, чтобы показать, что «Hoozit» наследуется от «Gizmo»:
function Hoozit(id) {
this.id = id;
}
Hoozit.prototype = new Gizmo();
Hoozit.prototype.test = function (id) {
return this.id === id;
};
Почему он пишет Hoozit.prototype = new Gizmo() вместо Hoozit.prototype = Gizmo.prototype?
Есть ли разница между этими двумя?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Причина в том, что использование Hoozit.prototype = Gizmo.prototype будет означать, что изменение объекта-прототипа Hoozit также изменит объекты типа Gizmo, что не является ожидаемым поведением.
Hoozit.prototype = new Gizmo() наследуется от Gizmo, а затем оставляет Gizmo в покое.
Если он напишет Whoozit.prototype = Gizmo.prototype, любая модификация, которую он внесет позже в прототип Hoozit, будет отражена в прототипе Gizmo.
В дополнение к ответу Триптиха: экземпляры Hoozit также наследуют все свойства экземпляра Gizmo, а не только те, которые определены в прототипе; например:
function Gizmo() {
this.foo = 'bar'; // foo is visible in every Hoozit instance
}
Другие ответы касаются этого, но если вы действительно хотите унаследовать прототип, вы можете использовать некоторую паразитическую магию:
Object.prototype.inherit = function(p) {
NewObj = function(){};
NewObj.prototype = p;
return new NewObj();
};
// Paraphrasing of Nicholas Zakas's Prototype Inheritance helper
function inheritPrototype(subType, superType) {
var prototype = Object.inherit(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
};
Теперь вы можете заменить:
Hoozit.prototype = new Gizmo();
с участием
inheritPrototype(Hoozit, Gizmo);
Это может не стоить хлопот, если у вас нет настоящего большого конструктора Gizmo (единственная победа в моем предложении состоит в том, что вам не нужно вызывать конструктор Gizmo для подключения прототипа). У меня есть примеры многих из этих типов паттернов в Примеры TDD JavaScript.
Но вы можете использовать косвенное (паразитное наследование), если не хотите вызывать конструктор.