JavaScript a method_missing
Ruby má method_missing.
PHP má __call.
Jen JavaScript nemá nic.
Teď střízlivěji
Předchozími řádky jsem se snažil naznačit, že mnohé dnešní dynamické
skriptovací jazyky nabízí programátorům zajímavou funkci – možnost
ovlivnit reakci objektů na volání nedefinované metody. Standardní reakcí je
obvykle vyhození výjimky, ale ve zmíněných jazycích je možné ve třídě definovat
metodu se speciálním názvem (ono method_missing
či
__call
), která je v takových případech zavolána místo původní
metody. Dostane její název a parametry a je už na ní, jak s voláním naloží.
Využití je mnoho – viz třeba výskyty
__call v PHP frameworku Nette, nebo známá
knihovna Builder v Ruby.
V JavaScriptu možnost reagovat na volání neznámé metody bohužel chybí a je docela možné, že pokud jste v tomto jazyce psali nějaký složitější kus kódu, už jste na to narazili.
Opravdu JavaScript něco takového nemá?
Při zkoumání zdrojového kódu SpiderMonkey za účelem psaní
článku
jsem s překvapením zjistil, že tento interpret odchyt volání nedefinovaných
funkcí uživatelem umožňuje. Magická metoda se jmenuje __noSuchMethod__
.
Funguje podobně jako ostatní zmiňované metody – obdrží název funkce spolu
s parametry a její výsledek bude výsledkem celého volání:
Object.prototype.__noSuchMethod__ = function(id, args) {
document.write(
"Called function \""
+ id
+ "\" with parameters \""
+ args
+ "\"."
);
}
var o = new Object();
o.f(1, 2, 3); // Called function "f" with parameters "1,2,3".
Podpora
Zkoumal jsem, zda __noSuchMethod__
podporují i další interprety JavaScriptu v
prohlížečích. Bohužel v IE, Opeře, Safari ani Chrome si ani neškrtnete a výše
uvedený příklad v nich skončí vyhozením chyby. Jediná reálně rozšířená
implementace JavaScriptu, která __noSuchMethod__
rozumí, je Rhino.
Díval jsem se také do aktuálního pracovního
návrhu ECMAScriptu 3.1 – v podstatě specifikace příští verze
JavaScriptu. Bohužel ani zde není __noSuchMethod__
zmíněna. Návrh
na začlenění byl
sice podán, ale následně byl zamítnut
(celé
vlákno). Pro ECMAScript 3.1 je prý příliš pozdě. Je to škoda, protože s
podporou standardu by začlenění __noSuchMethod__
do ostatních
prohlížečů v blízké budoucnosti bylo přeci jen pravděpodobnější.
Závěr
Pokud píšete JavaScript pouze pro Firefox (například v rozšířeních nebo
intranetových aplikacích), můžete s __noSuchMethod__
počítat
– je to užitečná drobná funkce. Na webu si na něj ale budete muset ještě
počkat.