Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 16.02.2013, 04:46
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Дзен-трансгуманист, опечатался, спасибо.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #3 (permalink)  
Старый 16.02.2013, 04:59
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от Дзен-трансгуманист
Ну, это логично, если у тебя сохраняется исходный контекст. Ведь тогда вызов this.parent.method() из B получается эквивалентен такому же вызову из C.
Удивительно.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #4 (permalink)  
Старый 16.02.2013, 05:38
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Дзен-трансгуманист, как?
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #5 (permalink)  
Старый 17.02.2013, 00:30
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Здесь надо как-то умудриться поиграться с caller (точнее с собственной реализацией), вот как, пока я не придумал.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #6 (permalink)  
Старый 17.02.2013, 02:54
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

Не красиво.
так что ли
obj.parent.parent.method();

?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 17.02.2013, 04:11
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

nerv_, нет, не так.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #8 (permalink)  
Старый 17.02.2013, 18:54
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

тогда я не понял, что ты хочешь (читал бегло)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение к функциям родительского окна realus Events/DOM/Window 3 14.08.2010 20:41