По сути, есть хороший элегантный механизм для эмуляции 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 to JavaScript или препроцессор JavaScript.
- Должен быть совместим с ES5
Наивная реализация будетбыть примерно таким.
var injectSuper = function (parent, child) {
child.prototype.$super = parent.prototype;
};
Но это нарушает условие 2 .
Самый элегантный механизм, который я когда-либо видел, это IvoWetzel eval
hack , который в значительной степени является препроцессором JavaScript и поэтому не соответствует критериям 4.