Gibt es eine Methode, die ich überladen kann, um nicht definierte Eigenschaften in JavaScript zu behandeln? [Duplikat]

9

Ich suche nach einer Möglichkeit, Aufrufe von undefinierten Methoden und Eigenschaften in JavaScript zu behandeln.

Dies wäre ähnlich den PHP-magischen Methoden __call, __callStatic, __get.

Ein Beispiel für den Code, der dies verwendet, könnte sein:

%Vor%

Dies würde dazu führen, dass der erste Alarmdialog "miau" anzeigt und der zweite "kitty, miau" anzeigt.

    
Alexander Trauzzi 26.02.2010, 19:46
quelle

5 Antworten

-1

Es gibt eine magische Funktion in Javascript namens __noSuchMethod__. Hier ist ein Beispiel:

%Vor%

BEARBEITEN: Wie @jldupont erwähnt, ist dies nur in Rhino und SpiderMonkey (Mozillas JS-Engine); Es wird im ECMAScript-Standard nicht unterstützt. Es gibt einige Anfragen, dass es in ECMAScript 4 ist.

    
Alex Beardsley 26.02.2010, 20:02
quelle
4

Proxy kann es tun! Proxy kann ALLES tun! Eine Antwort ist hier gegeben: Gibt es ein Javascript-Äquivalent von Pythons __getattr__ Methode? . Um mit meinen eigenen Worten zu formulieren:

%Vor%

Sehen Sie sich die MDN-Dokumentation an: Ссылка

Funktioniert in Chrome, Firefox und node.js. Nachteile: funktioniert nicht in IE - Freakin IE. Bald.

    
B T 20.03.2016 07:47
quelle
0

Wenn Sie nur etwas wie die Funktionen von PHP wollen, lesen Sie die folgende Lösung, die ich entwickelt habe. Ich gehe davon aus, dass Sie diese Funktionalität auf Ihre eigenen Objekte anwenden werden. Nun, solange sie keine Funktionen sind, können Sie aus Bequemlichkeit die folgende Konvention haben, und sie sollte in allen Browsern funktionieren:

anstelle von myobj.foo oder myobj ['foo'], verwenden Sie einfach myobj ('foo') und machen Sie Ihr Objekt aufrufbar, wenn Sie es definieren. Aber Sie müssen die Verwendung von "neu" vermeiden, da "neu" niemals eine Funktion in Javascript zurückgeben kann.

%Vor%

Und dann können Sie Objekte wie folgt erstellen:

%Vor%

Mit etwas ähnlich dem Douglas Crockford-Muster könnten Sie "Klassen" erstellen, die das erweitern:

%Vor%

Oder, um Konstruktoren zu vergessen, können Sie einfach einen Wrapper um Objekte erstellen:

%Vor%

Sie müssen diese Dokumentation nur für alle Benutzer Ihres Codes veröffentlichen. Es ist wirklich gut, Ihre Funktionalität durch diese Konvention offen zu legen, weil Sie nicht Leute durch Verwendung von Nicht-Standard-Javascript verarschen wollen.

    
Magarshak 26.02.2010 21:16
quelle
-1

Ich sollte hinzufügen für Leute, die immer noch nach einer Lösung suchen, gibt es das:

%Vor%

Der einzige Unterschied besteht darin, dass Sie möglicherweise über das hinausgehen müssen, was Sie hinzufügen möchten. Dadurch werden die Methoden vorgeneriert, anstatt sie einfach dynamisch zu behandeln.

    
Alexander Trauzzi 26.02.2010 20:59
quelle
-1

Wenn Sie speziell nach einer Methode suchen, müssen Sie bis ES7 warten, weil es so aussieht, als würden sie es nicht in Harmonie einschließen. Es gibt eine funktionierende Standardfunktionalität in diesem Fall -in Objekt Proxy, die in ES6 hinzugefügt wird, schrieb ich eine Antwort, in diese Frage , die das Problem umfassender angeht. Grundsätzlich beinhaltet das Wrapping des Objekts in einen Proxy, das Laden eines Handlers

%Vor%

in den Proxy durch seinen Konstruktor, um alle Anfragen von Eigenschaften zu handhaben, zu filtern oder zu implementieren.

Und es fügt noch mehr Funktionalität hinzu .... Für die vollständige Antwort gehen Sie auf den Link.

    
Nicolas NZ 23.02.2015 07:58
quelle

Tags und Links