Прототип наследования в JavaScript - PullRequest
8 голосов
/ 23 декабря 2008

Я смотрел выступления Дугласа Крокфорда в театре YUI, и у меня есть вопрос о наследовании 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?

Есть ли разница между этими двумя?

Ответы [ 4 ]

17 голосов
/ 23 декабря 2008

Причина в том, что использование Hoozit.prototype = Gizmo.prototype будет означать, что изменение объекта-прототипа Hoozit также приведет к изменению объектов типа Gizmo, что не является ожидаемым поведением.

Hoozit.prototype = new Gizmo() наследуется от Gizmo, а затем оставляет Gizmo в покое.

3 голосов
/ 29 октября 2009

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

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 .

2 голосов
/ 23 декабря 2008

В дополнение к ответу Триптиха: экземпляры Hoozit также наследуют все свойства экземпляров Gizmo, а не только те, которые определены в прототипе; например:

function Gizmo() {
    this.foo = 'bar'; // foo is visible in every Hoozit instance
}
2 голосов
/ 23 декабря 2008

Если он напишет Hoozit.prototype = Gizmo.prototype, любая модификация, которую он внесет позже в прототип Hoozit, будет отражена в прототипе Gizmo.

...