Уже довольно продолжительное время не могу въехать в то, как реализовать вызов сабжа, не вызывая бесконечной рекурсии. Вопрос касается эмуляции классов.
Приводить какую-то конкретную реализацию классов не буду, все те, кто может ответить на мой вопрос видели множество таких функций.
A = Class({
method: function() {
console.log( 'A' );
}
});
B = Class({
extend: A,
method: function() {
console.log( 'B' );
this.parent.method();
}
});
C = Class({
extend: B,
method: function() {
console.log( 'C' );
this.parent.method();
}
});
Поддержку работы
(new B).method(); // > B, A
реализовать не проблема (при создании класса в объект parent закинуть методы, работающие с текущим контекстом).
Но вот
(new C).method(); // > C, B, B, B, B, B,...
уже вызовет проблему:
В методе класса
B наличествует строка, которая запустит метод повторно, вызвав тем самым бесконечную рекурсию.
Решение проблемы нашел
devote, но я не смог разобраться какое именно (не смог осилить код).
Аквариум тоже хвастался наличием вызова родительских методов, но из-за неадекватности персонажа и отсутствия какого-либо репозитория, решение было утеряно.
Мне просто хочется избежать указания имени класса, когда я хочу вызвать метод:
C.parent.method( this );
Не красиво.
B.prototype.method.apply( this );
Еще хуже.
Так можно не бояться переименовывать классы, придерживаться одного стиля и пр.
PS Проблема не высосана из пальца, это поиск гармонии в коде, ведь, рано или поздно, каждый программист становится перфекционистом.