Итак, каковы причины выбора классического наследования в стиле ООП вместо прототипного наследования? На самом деле, я считаю, что некоторые фреймворки "как бы" комбинируют подходы. Возьмем, к примеру, паттерн Parasitic Combination Inheritance. Это то, что делает YAHOO.lang.extend.
Он использует прототипное наследование и вспомогательную функцию для наследования прототипов и кражи конструктора. Вау, это звучит сложно... ну да, вот моя реализация и тест, например:
// Prototypal Inheritance
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;
};
function SubType(name, age) {
Parent.call(this, name);
this.age = age;
};
inheritPrototype(SubType, Parent);
SubType.prototype.getAge = function() {
return this.age;
};
У меня есть тест для этого кода:
describe 'Parisitic Combination Inheritance'
it 'should use inheritPrototype (to call parent constructor once) and still work as expected'
sub = new SubType("Nicholas Zakas", 29)
sub.toString().should.match /.*Nicholas Zakas/
sub.getAge().should.eql 29
charlie = new SubType("Charlie Brown", 69)
charlie.arr.should.eql([1,2,3])
charlie.arr.push(999)
charlie.arr.should.eql([1,2,3,999])
sub.arr.should.eql([1,2,3])
sub.should.be_an_instance_of SubType
charlie.should.be_an_instance_of SubType
(sub instanceof SubType).should.eql true
(sub instanceof Parent).should.eql true
end
end
И, конечно же, если вы обращаете внимание на мои литералы, вы видите: Николас Закас, парень, от которого я получил это ;) Большие победы для этого: instanceof работает (некоторые говорят, что это большое дело, и я отчасти согласен); экземпляры не разделяют состояние ссылочных типов, таких как массивы (важно!); родительский конструктор вызывается только один раз (важно!).
Кстати, у меня есть примеры большинства популярных шаблонов наследования здесь: Мои примеры TDD JS а>
person
Rob
schedule
29.10.2009