Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обращение к методу прототипа родительского конструктора (https://javascript.ru/forum/misc/35614-obrashhenie-k-metodu-prototipa-roditelskogo-konstruktora.html)

FINoM 16.02.2013 03:15

Обращение к методу прототипа родительского конструктора
 
Уже довольно продолжительное время не могу въехать в то, как реализовать вызов сабжа, не вызывая бесконечной рекурсии. Вопрос касается эмуляции классов.

Приводить какую-то конкретную реализацию классов не буду, все те, кто может ответить на мой вопрос видели множество таких функций.

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 Проблема не высосана из пальца, это поиск гармонии в коде, ведь, рано или поздно, каждый программист становится перфекционистом.

FINoM 16.02.2013 04:46

Дзен-трансгуманист, опечатался, спасибо.

FINoM 16.02.2013 04:59

Цитата:

Сообщение от Дзен-трансгуманист
Ну, это логично, если у тебя сохраняется исходный контекст. Ведь тогда вызов this.parent.method() из B получается эквивалентен такому же вызову из C.

Удивительно.

FINoM 16.02.2013 05:38

Дзен-трансгуманист, как?

FINoM 17.02.2013 00:30

Здесь надо как-то умудриться поиграться с caller (точнее с собственной реализацией), вот как, пока я не придумал.

nerv_ 17.02.2013 02:54

Цитата:

Сообщение от FINoM
Мне просто хочется избежать указания имени класса, когда я хочу вызвать метод:
C.parent.method( this );

Не красиво.

так что ли
obj.parent.parent.method();

?

FINoM 17.02.2013 04:11

nerv_, нет, не так.

nerv_ 17.02.2013 18:54

тогда я не понял, что ты хочешь (читал бегло)


Часовой пояс GMT +3, время: 12:39.