Нужно ли реализовать множественное наследование? В своем проекте для наследования я реализовал функциюfunction inherit(child, parent, proto, descriptor) { if (!descriptor) descriptor = {}; descriptor['base'] = { value: parent, enumerable: false, writable: false }; child.prototype = Object.create(parent.prototype); child.prototype.constructor = child; var names = proto ? Object.getOwnPropertyNames(proto) : []; for (var i in names) { var name = names[i]; descriptor[name] = Object.getOwnPropertyDescriptor(proto, name); } Object.defineProperties(child.prototype, descriptor); child.descriptor = descriptor; return child; }Если в дочерных классах нужно обратиться геттерам-сеттерам базового, то используется child.descriptor Что вы посоветуете, если я хочу в качестве parent передавать множество классов (конструкторов)? Или лучше прототип расширять после применения функции наследования? Собственно для этого у меня есть тоже велосипед:function ext(target, extension) { if (target.prototype) target = target.prototype; for (var key in extension) if (!(key in target)) Object.defineProperty(target, key, { value: extension[key], enumerable: false }); } Правда он предназначен для безопасного расширения базовых классов, типа HTMLElement
Если вы хотите передавать множество классов в качестве родителей, то можно модифицировать функцию наследования таким образом, чтобы она принимала несколько родительских классов в качестве аргументов. Например, вы можете передавать массив конструкторов классов в качестве аргумента и расширять прототип ребенка последовательно для каждого родительского класса.
Например:
function inherit(child, parents, proto, descriptor) { if (!descriptor) descriptor = {}; descriptor['base'] = { value: parents, enumerable: false, writable: false }; for (var i = 0; i < parents.length; i++) { Object.assign(child.prototype, Object.create(parents[i].prototype)); } child.prototype.constructor = child; var names = proto ? Object.getOwnPropertyNames(proto) : []; for (var i in names) { var name = names[i]; descriptor[name] = Object.getOwnPropertyDescriptor(proto, name); } Object.defineProperties(child.prototype, descriptor); child.descriptor = descriptor; return child; } // Пример использования: function Parent1() {} Parent1.prototype.method1 = function() { console.log('Method 1'); } function Parent2() {} Parent2.prototype.method2 = function() { console.log('Method 2'); } function Child() {} inherit(Child, [Parent1, Parent2]); var child = new Child(); child.method1(); // Method 1 child.method2(); // Method 2
Таким образом, вы сможете создавать дочерние классы, наследующие свойства и методы сразу из нескольких родительских классов. Ваша функция ext также может быть использована для расширения методов классов после их наследования.
Если вы хотите передавать множество классов в качестве родителей, то можно модифицировать функцию наследования таким образом, чтобы она принимала несколько родительских классов в качестве аргументов. Например, вы можете передавать массив конструкторов классов в качестве аргумента и расширять прототип ребенка последовательно для каждого родительского класса.
Например:
function inherit(child, parents, proto, descriptor) {if (!descriptor)
descriptor = {};
descriptor['base'] = {
value: parents,
enumerable: false,
writable: false
};
for (var i = 0; i < parents.length; i++) {
Object.assign(child.prototype, Object.create(parents[i].prototype));
}
child.prototype.constructor = child;
var names = proto ? Object.getOwnPropertyNames(proto) : [];
for (var i in names) {
var name = names[i];
descriptor[name] = Object.getOwnPropertyDescriptor(proto, name);
}
Object.defineProperties(child.prototype, descriptor);
child.descriptor = descriptor;
return child;
}
// Пример использования:
function Parent1() {}
Parent1.prototype.method1 = function() {
console.log('Method 1');
}
function Parent2() {}
Parent2.prototype.method2 = function() {
console.log('Method 2');
}
function Child() {}
inherit(Child, [Parent1, Parent2]);
var child = new Child();
child.method1(); // Method 1
child.method2(); // Method 2
Таким образом, вы сможете создавать дочерние классы, наследующие свойства и методы сразу из нескольких родительских классов. Ваша функция ext также может быть использована для расширения методов классов после их наследования.