В принципе есть хороший элегантный механизм для эмуляции super
с синтаксисом, который прост как один из следующих
-
this.$super.prop()
-
this.$super.prop.apply(this, arguments);
Критерии для подтверждения:
-
this.$super
должен быть ссылкой на прототип. т.е. если я изменю суперпроиотип во время выполнения, это изменение будет отражено. Это в основном означает, что у родителя есть новое свойство, тогда это должно отображаться во время выполнения для всех детей с помощьюsuper
точно так же, как жестко закодированная ссылка на родителя будет отражать изменения -
this.$super.f.apply(this, arguments);
должен работать для рекурсивных вызовов. Для любого набора цепочек наследования, когда совершаются множественные супервызывы при продвижении цепи наследования, вы не должны ударять по рекурсивной проблеме. - Вы не должны указывать ссылки на супер объекты в своих дочерних элементах. То есть
Base.prototype.f.apply(this, arguments);
побеждает точку. - Вы не должны использовать компилятор X-JavaScript или препроцессор JavaScript.
- Должен быть совместим с ES5
Наивная реализация будет примерно такой.
var injectSuper = function (parent, child) {
child.prototype.$super = parent.prototype;
};
Но это прерывает условие 2.
Самый элегантный механизм, который я видел на сегодняшний день, - это IvoWetzel eval
hack, который в значительной степени является препроцессором JavaScript и, следовательно, не соответствует критериям 4.