Скажет у меня есть следующие типы объектов:JavaScript - Специальное множественное наследование
var Positionable = function() { };
Positionable.prototype.x = 0;
Positionable.prototype.y = 0;
var Sizable = function() { };
Sizable.prototype.w = 0;
Sizable.prototype.h = 0;
var Fadable = function() { };
Fadable.prototype.a = 0;
Я хотел бы иметь функцию, позволяющую мне создать подтип, который унаследует от нескольких других типов. Например, я мог бы создать тип Rectangle
, который наследует как от Positionnable
, так и от Sizable
.
I Could прототипы цепи:
var Rectangle = function() { };
Sizable.prototype = new Positionable;
Rectangle.prototype = new Sizable;
Но я не люблю этот метод Fo по двум причинам:
Это вызывает Sizable наследовать от
Positionable
, что означает, что если я хочу другого тип должен быть значимым безPositionable
, я не могу этого сделать;Это означает, что
Sizable
объект такжеPositionnable
, которые семантически не хорошо, так как нет никаких оснований дляSizable
объекта бытьPositionnable
, а не иначе.
Так я первый подумал о слиянии прототипов, предполагая, что у меня есть функция void merge(type dst, type src, bool overwrite)
, в цикле я бы просто объединить все базовый класс прототип в типе ребенка прототип. Это не создало бы цепочку (это то, что я хочу, как объяснялось выше)
Но это вызывает еще одну проблему: поскольку я не использую новый, базовые конструкторы не вызываются. Так что интересно, есть ли способ объединить конструкторы? Например, если бы я мог обращаться к базовым конструкторам и ссылаться на них, я мог бы хранить каждый из этих базовых конструкторов в массиве и назначать конструктору дочернего типа функцией, вызывающей каждый из этих конструкторов последовательно.
Как я могу сделать это с помощью конструкторов? Или, может быть, есть другой способ?
Благодарим за помощь!
Благодарим за помощь. Я, вероятно, сделаю это, если нет другого пути, но «проблема», которую я вижу в этом, заключается в том, что я должен сделать две вещи вместо одной: 1) вызвать родительские конструкторы в дочернем конструкторе, 2) объединить прототипы ,Я хотел бы сделать все это в одной функции, но чтобы иметь возможность сделать это, мне понадобится возможность доступа и назначения конструкторов. Является ли это возможным ? Благодарю. – Virus721
@ Virus721: Вы всегда должны вызывать родительские конструкторы внутри дочернего конструктора, так как здесь происходит вся инициализация, специфичная для экземпляра. Конечно, если родительские конструкторы ничего не делают (т. Е. Они не содержат никакого кода), тогда вам не нужно их вызывать. Вы можете автоматизировать весь процесс, если вам хорошо переопределить функцию «Прямоугольник». Я отправлю пример. –
Функциональность Mixix Dojo пришла на ум, прочитав этот вопрос, и автоматически обрабатывает цепи конструктора. В зависимости от ваших потребностей и требований я бы предложил изучить его. – Phix