Нужно ли реализовать множественное наследование? В своем проекте для наследования я реализовал функцию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
217 +1
1
Ответы
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 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 706 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир