Показать сообщение отдельно
  #1 (permalink)  
Старый 16.02.2013, 03:15
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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

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

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 Проблема не высосана из пальца, это поиск гармонии в коде, ведь, рано или поздно, каждый программист становится перфекционистом.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности

Последний раз редактировалось FINoM, 16.02.2013 в 04:46.
Ответить с цитированием