2012-06-15 9 views
5

ja przepisywania jeden z podstawowych metod Javascript w:JavaScript metaprogramming: uzyskać nazwę funkcji aktualnie wykonującego, który został dynamicznie przepisany

Element.prototype._removeChild = Element.prototype.removeChild; 
Element.prototype.removeChild = function(){ 
    callback(); 
    this._removeChild.apply(this,arguments); 
} 

chcę dynamicznie uzyskać nazwę metody (w tym przypadku „removeChild”) od wewnątrz funkcji dynamicznie przepisywanej. Używam arguments.callee.name, ale wydaje się, że nic nie zwraca, uważając, że jest to tylko anonimowa funkcja. Jak uzyskać nazwę funkcji, do której przypisywana jest funkcja anonimowa?

+4

Javascript nie posiada metod. Tylko funkcje przypisane do właściwości. W tym przypadku 'Element.prototype.removeChild' jest jedną właściwością, do której jest przypisany, może być również przypisany do innego miejsca w tym samym czasie. To nie jest nazwa funkcji, nie ma ona nazwy. Funkcja nie wie, do ilu właściwości jest przypisana lub do jakich właściwości jest przypisana. – Esailija

Odpowiedz

5

To jest anonimowa funkcja. Właśnie przypisujesz tę anonimową funkcję do właściwości Element.prototype.removeChild, ale to nie czyni tej właściwości nazwy dla funkcji. Możesz przypisać tę samą funkcję do wielu zmiennych i właściwości, i nie ma sposobu, aby poznać nazwę, pod którą została wywołana.

Można jednak dać funkcję właściwej nazwy, które można uzyskać dostęp za arguments.callee.name:

Element.prototype.removeChild = function removeChild() { 
    .... 
} 
+0

ahhhh ma 100% sensu. dzięki! – user730569

+1

+1 Jest to idealne, ponieważ wtedy funkcja może odnosić się do siebie przez 'removeChild', ale' removeChild' jest wciąż niezdefiniowana poza funkcją. Z wyjątkiem IE 8 i poniżej, które nie implementują poprawnie Javascript. W IE 8 i pod 'removeChild' jest wystawiony na zewnętrzny zasięg (możliwy globalny), chyba że otoczysz zamknięcie wokół całej rzeczy:' (function() {Element.prototype.removeChild = function removeChild() {...})(); ' – Paulpro

+0

Ponieważ dałeś tej funkcji nazwę, możesz użyć nazwy zamiast przestarzałego' arguments.callee'. Ale znowu "removeChild.name" ...: P – Esailija

Powiązane problemy