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".

Vyzkoušejte si

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.

Odkazy

Jan 27, 2009 – 9:27

Comments

Jakub Vrána
Zavolání neexistující metody vyvolá výjimku. Tato výjimka by šla odchytit a přeložit na volání __noSuchMethod__. Problém je, že v JavaScriptu se nedá výjimka zrušit (vrátit se za místo, kde k ní došlo). Kdyby to šlo, tak by celý kód stačilo uzavřít do jednoho try..catch a __noSuchMethod__ by bylo na světě.

Add comment

It is not possible to add comments to posts older than one month.