Нужно ли реализовать множественное наследование? В своем проекте для наследования я реализовал функцию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

21 Авг 2019 в 07:08
261 +1
2
Ответы
1

Если вы хотите передавать множество классов в качестве родителей, то можно модифицировать функцию наследования таким образом, чтобы она принимала несколько родительских классов в качестве аргументов. Например, вы можете передавать массив конструкторов классов в качестве аргумента и расширять прототип ребенка последовательно для каждого родительского класса.

Например:

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 также может быть использована для расширения методов классов после их наследования.

20 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир