Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.03.2009, 15:49
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

Overloading в JavaScript
Привет!
Существует в JS методика или какой-нибудь хак, позволяющий перехватывать и корректно обрабатывать запросы к несуществующим методам?

Как пример, метод __call в PHP5.
Ответить с цитированием
  #2 (permalink)  
Старый 19.03.2009, 16:08
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

try/catch ?
Ответить с цитированием
  #3 (permalink)  
Старый 19.03.2009, 16:13
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

ZoNT,
Предполагается, что это "забота" не того кто будет делать вызов, а того кто создал объект. При таком вызове мне надо получить имя запрашиваемого метода и переданные аргументы.
Ответить с цитированием
  #4 (permalink)  
Старый 19.03.2009, 16:29
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

Как вариант, меня еще устроило-бы такое решение: если-бы с помощью "caller" можно было получить ссылку не только на вызывающую функцию но и на объект содержащий этот метод. В этом случае в прототипе можно произвести какие-либо вспомогательные действия (определить какие-то свойства и т.п.).
Но в последнем случае обязательно надо учитывать что на основе этого прототипа будет создано много объектов. У меня получилось создать ссылку только на последний объект, а на "текущий" - никак...

P.S. В идеале хотелось бы обе методики иметь в арсенале "Overloading" и "caller" со ссылкой на объект.
Ответить с цитированием
  #5 (permalink)  
Старый 19.03.2009, 16:44
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

в общем, я так и не понял, что тебе надо...
Ответить с цитированием
  #6 (permalink)  
Старый 19.03.2009, 16:49
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

no_alex, на данный момент такой функционал есть только у FF. Метод называется __noSuchMethod__ (это именно аналог __call из PHP и method_missing из Ruby).

В остальный случаях: либо проверка через in - if ('method' in object) {...}, либо try {...} catch () {...}.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #7 (permalink)  
Старый 19.03.2009, 17:14
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

Dmitry A. Soshnikov,
Цитата:
на данный момент такой функционал есть только у FF
Жаль, жаль... Мне надо кроссбраузерное решение.

Цитата:
либо проверка через in - if ('method' in object) {...}
У меня проблема именно "поймать" этот объект.



Попробую еще раз пояснить что мне надо во втором случае.

Есть некий объект (A) у которого будут вызываться различные методы. И есть серия объектов (B1, B2, B3,...) которые будут обращаться к методам A.
У B1, B2, B3,... общий прототип (P). В прототипе P или в конструкторе, при создании объекта, я могу создать что-либо, что позволит потом получить ссылку на этот объект.

Теперь сама задача: когда B1, B2, B3,... обращается к методам A в этих методах я могу обратиться к "caller", но при этом я получаю ссылку на саму функцию прототипа P. А мне еще надо получить ссылку на объект у которого она была вызвана.

Пока объект B1 существует в единственном экземпляре проблем нет - я его цепляю к прототипу и потом легко получаю, но как только появляется B2, B3,... уже достучаться до текущего объекта не получается.
Ответить с цитированием
  #8 (permalink)  
Старый 19.03.2009, 17:28
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от ZoNT
в общем, я так и не понял, что тебе надо
Ему нужно реализовать паттерн делегатор. Если бы его можно было в js реализовать, я бы бед не знал
Ответить с цитированием
  #9 (permalink)  
Старый 19.03.2009, 17:34
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

попробуйте поигратся с this-ом
если я правильно понял вашу задачу, то вот два варианта решения:
A=
	{
	'func':function(that)
		{
		console.log(['func',that==window.B1])//TRUE.that указывает на B1, вызвавший функцию
		},
	'func2':function()
		{
		console.log(['func2',this==window.B1])//TRUE.this указывает на B1, вызвавший функцию
		}
	}

B_proto=
	{
	'function':function()
		{
		console.log([this,this==window.B1,this==window.B2])//this указывает на B1, вызвавший функцию
		A.func(this)
		A.func2.apply(this,[])
		}
	}
function B()
	{
	//functio
	}
B.prototype=B_proto;

B1=new B();
B2=new B();
B1.function()
Ответить с цитированием
  #10 (permalink)  
Старый 19.03.2009, 17:35
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Kolyaj,
что такое паттерн делегатор?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лучшая книга по JavaScript Systemnik Оффтопик 27 26.08.2012 16:54
Помогите с javascript andruhin Общие вопросы Javascript 12 04.05.2012 10:05
Современная книга по JavaScript twolf Оффтопик 18 21.02.2009 01:20
Программист на JavaScript (удалённо) Vadym Работа 1 28.01.2009 13:57
Нужен Старший разработчик JavaScript Yandex Работа 17 19.08.2008 16:43