Переписанный под синтаксис ES5 пример множественного наследования, специально для foo:
function inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype);
if (superClass) {
Object.setPrototypeOf(subClass, superClass);
}
}
function pluralParent() {
var parents = [].slice.call(arguments);
//Наследование конструктора
var DerivativeParent = function() {
var i;
var Parent;
for (i = 0; i < parents.length; i++) {
Parent = parents[i];
Object.assign(this, new Parent());
}
};
//Наследование свойств прототипа
DerivativeParent.prototype = new Proxy(DerivativeParent.prototype, {
get: function(target, name) {
if (name in target) {
return target[name];
}
var i;
var Parent;
for (i = 0; i < parents.length; i++) {
Parent = parents[i];
if (name in Parent.prototype) {
return Parent.prototype[name];
}
}
}
});
//Наследование статических свойств класса
DerivativeParent = new Proxy(DerivativeParent, {
get: function(target, name) {
if (name in target) {
return target[name];
}
var i;
var Parent;
for (i = 0; i < parents.length; i++) {
Parent = parents[i];
if (name in Parent) {
return Parent[name];
}
}
}
});
return DerivativeParent;
}
var Cat = function() {
this.isACat = true;
}
Cat.prototype.meow = function() {
console.log("meow");
}
var Dog = function() {
this.isADog = true;
}
Dog.prototype.bark = function() {
console.log("woof");
}
var CatDog = function() {
//Вызвать родительский конструктор. Можно не вызывать - тогда установленные в конструкторах свойства не унаследуются.
Object.getPrototypeOf(this.constructor).apply(this, arguments);
};
inherits(CatDog, pluralParent(Cat, Dog));
var catDog = new CatDog();
catDog.meow();
catDog.bark();
console.log(catDog);
Запускать надо в последнем FF (IceCat на дебиане): v8 еще не поддерживает вошедшие в релиз стандарта прокси ES6.