|
Overloading в JavaScript
Привет!
Существует в JS методика или какой-нибудь хак, позволяющий перехватывать и корректно обрабатывать запросы к несуществующим методам? Как пример, метод __call в PHP5. |
try/catch ?
|
ZoNT,
Предполагается, что это "забота" не того кто будет делать вызов, а того кто создал объект. При таком вызове мне надо получить имя запрашиваемого метода и переданные аргументы. |
Как вариант, меня еще устроило-бы такое решение: если-бы с помощью "caller" можно было получить ссылку не только на вызывающую функцию но и на объект содержащий этот метод. В этом случае в прототипе можно произвести какие-либо вспомогательные действия (определить какие-то свойства и т.п.).
Но в последнем случае обязательно надо учитывать что на основе этого прототипа будет создано много объектов. У меня получилось создать ссылку только на последний объект, а на "текущий" - никак... :( P.S. В идеале хотелось бы обе методики иметь в арсенале "Overloading" и "caller" со ссылкой на объект. |
в общем, я так и не понял, что тебе надо...
|
no_alex, на данный момент такой функционал есть только у FF. Метод называется __noSuchMethod__ (это именно аналог __call из PHP и method_missing из Ruby).
В остальный случаях: либо проверка через in - if ('method' in object) {...}, либо try {...} catch () {...}. |
Dmitry A. Soshnikov,
Цитата:
Цитата:
Попробую еще раз пояснить что мне надо во втором случае. Есть некий объект (A) у которого будут вызываться различные методы. И есть серия объектов (B1, B2, B3,...) которые будут обращаться к методам A. У B1, B2, B3,... общий прототип (P). В прототипе P или в конструкторе, при создании объекта, я могу создать что-либо, что позволит потом получить ссылку на этот объект. Теперь сама задача: когда B1, B2, B3,... обращается к методам A в этих методах я могу обратиться к "caller", но при этом я получаю ссылку на саму функцию прототипа P. А мне еще надо получить ссылку на объект у которого она была вызвана. Пока объект B1 существует в единственном экземпляре проблем нет - я его цепляю к прототипу и потом легко получаю, но как только появляется B2, B3,... уже достучаться до текущего объекта не получается. |
Цитата:
|
попробуйте поигратся с 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() |
Kolyaj,
что такое паттерн делегатор? |
Часовой пояс GMT +3, время: 19:43. |
|