Эмулированное множественное наследование в javascript становится кошмаром.
Я написал целую пользовательскую оболочку класса, чтобы разрешить динамическое множественное наследование, и отказался от нее через месяц, потому что это просто не стоит.Сложность растет из-под контроля.
Вместо того, чтобы использовать множественное наследование, вы можете расширить свой объект методами его родителей.
Я рекомендую вам придерживаться простых конструкторов объектов и прототипа, а не включать внешние эмуляторы "классического ОО".JavaScript в значительной степени ориентирован на прототип OO, который является объектом, наследуемым от другого объекта, а не классом, расширяющим другой класс.
Если вы хотите, чтобы множественное наследование придерживалось композиции объекта.
Будьте осторожны: при этом используется_
для простоты и краткости.
function Child() {
var parent1 = new Parent1();
var parent2 = new Parent2();
// bind this to parent1 so it's got it's own internal scope
_.bindAll(parent1);
_.bindAll(parent2);
// extend this with parent1 and parent2
_.extend(this, parent1);
_.extend(this, parent2);
}
Да, вы теряете instanceof
проверку.Разобраться с этим.
В более общем смысле вы можете расширить любой объект, который вам нужен.
function extend(f, arr) {
// return a new function to replace f.
return function() {
// store the correct this value
var that = this;
// call original f
f.apply(this, arguments);
// for each parent call it with the original this
_.each(arr, function(v) {
v.apply(that, arguments);
});
// add f to the parent array
arr.push(f);
// store the array on the object to use with instance_of
this.__instance = arr;
}
}
function instance_of(o, klass) {
// is the klass included in the .__instance array ?
return _.include(o.__instance, klass);
}
function Child() {
// do stuff
this.method = function() { console.log("method"); return this;};
}
function Parent1() {
this.foo = function() { console.log("foo"); return this; };
}
function Parent2() {
this.bar = function() { console.log("bar"); return this;};
}
Child = extend(Child, [Parent1, Parent2]);
var c = new Child();
console.log(instance_of(c, Parent1)); // true
console.dir(c);
c.method().foo().bar();
Это зависит от underscore.js
для реализации некоторых хороших абстракций для сохраненияПример кода маленький. .extend , .bindAll .
См. живой пример