Kann die Funktion "Anruf" überschrieben werden?

8

Ist es möglich, die "Call" -Funktion auf einer generischen Ebene zu überschreiben, so dass jedes Mal, wenn eine Methode irgendwo in der App aufgerufen wird, etwas passiert.

Ich habe versucht, Object.call zu überschreiben, aber obwohl ich es geschafft habe, hat es an der Funktionsweise meiner App nichts geändert.

Übrigens, auch wenn es funktioniert, sollte ich jedes Mal explizit "foo.call (this, args)" aufrufen, oder funktionieren normale Funktionsaufrufe auch "foo (args)"?

    
user802232 07.09.2011, 06:51
quelle

2 Antworten

8

Klingt so, als ob Sie hier eine Art von aspektorientierter Programmierung machen möchten ...

JavaScript hat als ECMAScript-Dialekt die Vorstellung eines aufrufbaren Objekts . Jedes aufrufbare Objekt hat eine interne Eigenschaft namens [[Call]] . Diese Eigenschaft wird in Abschnitt 8.6.2, Tabelle 9, der ECMA-262-Spezifikation, 5. Ausgabe, beschrieben. Es sagt:

  

Führt den Code aus, der dem Objekt zugeordnet ist. Wird über einen Funktionsaufruf-Ausdruck aufgerufen. Die Argumente für das SpecOp sind ein this-Objekt und eine Liste mit den Argumenten, die an den Funktionsaufruf-Ausdruck übergeben werden. Objekte, die diese interne Methode implementieren, sind aufrufbar. Nur aufrufbare Objekte, die Hostobjekte sind, können Referenzwerte zurückgeben.

Beachten Sie jedoch, dass [[Call]] eine interne Eigenschaft ist, für die in der Spezifikation Folgendes steht:

  

Eine interne Eigenschaft hat keinen Namen und ist nicht direkt über ECMAScript-Sprachenoperatoren zugänglich. Interne Eigenschaften existieren nur für Spezifikationszwecke.

Sie können also nicht in Ihren eigenen JavaScript-Code einhaken.

Nun sind zwei Methoden definiert in Function.prototype , apply und call . Wenn Sie die Definition von Function.prototype.call ändern, dann wird f tatsächlich, wenn Sie Ihre eigene Funktion f.call erstellen, diesen Code tatsächlich ausführen (es sei denn, in fs Prototyp oder in f selbst überschrieben). Dies wird, wie Sie vermutet haben, NICHT automatisch geschehen, wenn Sie f direkt aufrufen. Sie müssen explizit die Methode call aufrufen.

Alles, was gesagt wurde, ist es am besten, nicht mit vordefinierten Standardmethoden in den Prototypen der eingebauten Objekte herumzureißen. Viele vorhandene Codes in Bibliotheken und Anwendungen hängen von Function.prototype.call ab. Leg dich nicht damit an. Sie können natürlich eine Art von AOP-Verhalten in vielerlei Hinsicht implementieren. Eine besteht darin, zu Function.prototype eine andere Methode hinzuzufügen, aber tue dies auch nicht . Eine andere Möglichkeit besteht darin, eine eigene Aufrufmethode mit vor und nach Hooks zu schreiben:

%Vor%     
Ray Toal 07.09.2011, 07:19
quelle
0

Mit anderen Worten, Sie möchten jeden Funktionsaufruf abfangen, der Ihre Anwendung ausführt? Es gibt keine Möglichkeit, dies zu tun, zumindest nicht auf einer allgemeinen Ebene.

    
WTK 07.09.2011 06:56
quelle

Tags und Links