Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Overloading в JavaScript (https://javascript.ru/forum/misc/3116-overloading-v-javascript.html)

no_alex 19.03.2009 15:49

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

Как пример, метод __call в PHP5.

ZoNT 19.03.2009 16:08

try/catch ?

no_alex 19.03.2009 16:13

ZoNT,
Предполагается, что это "забота" не того кто будет делать вызов, а того кто создал объект. При таком вызове мне надо получить имя запрашиваемого метода и переданные аргументы.

no_alex 19.03.2009 16:29

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

P.S. В идеале хотелось бы обе методики иметь в арсенале "Overloading" и "caller" со ссылкой на объект.

ZoNT 19.03.2009 16:44

в общем, я так и не понял, что тебе надо...

Dmitry A. Soshnikov 19.03.2009 16:49

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

В остальный случаях: либо проверка через in - if ('method' in object) {...}, либо try {...} catch () {...}.

no_alex 19.03.2009 17:14

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,... уже достучаться до текущего объекта не получается.

Kolyaj 19.03.2009 17:28

Цитата:

Сообщение от ZoNT
в общем, я так и не понял, что тебе надо

Ему нужно реализовать паттерн делегатор. Если бы его можно было в js реализовать, я бы бед не знал :)

Gvozd 19.03.2009 17:34

попробуйте поигратся с 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()

Gvozd 19.03.2009 17:35

Kolyaj,
что такое паттерн делегатор?


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