Так каковы причины выбора классического наследования в стиле ООП вместо наследования прототипа?
На самом деле, я считаю, что некоторые фреймворки являются «своего рода» комбинирующими подходами. Возьмем, к примеру, паттерн наследования паразитных комбинаций. Это то, что делает 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