Ich kann anscheinend nicht den Weg finden, den Operator [] in Javascript zu überladen. Weiß da draußen jemand Bescheid?
Ich dachte an ...
MyClass.operator.lookup(index)
{
return myArray[index];
}
oder schaue ich nicht auf die richtigen Dinge.
javascript
operator-overloading
Slyprid
quelle
quelle
MyClass
Objekt einfach zu einem Array. Sie können die Schlüssel und Werte vonmyArray
in Ihrvar myObj = new MyClass()
Objekt kopieren .Antworten:
Sie können Operatoren in JavaScript nicht überladen.
Es wurde für ECMAScript 4 vorgeschlagen, aber abgelehnt.
Ich glaube nicht, dass du es bald sehen wirst.
quelle
Object arg1: a arg2: b arg3: c
abObject["arg1:arg2:arg3:"](a,b,c)
. So können Sie habenmyObject["[]"](1024)
: PSie können dies mit ES6 Proxy tun (in allen modernen Browsern verfügbar).
Überprüfen Sie die Details zu MDN .
quelle
target[name]
im Getter zurückkehren, OP zeigt nur die Beispiele[]
Bediener, übrigens:var key = 'world';
console.log(proxy[key]);
Die einfache Antwort lautet, dass JavaScript den Zugriff auf untergeordnete Elemente eines Objekts über die eckigen Klammern ermöglicht.
So können Sie Ihre Klasse definieren:
Sie können dann mit jeder Syntax auf die Mitglieder in allen Instanzen Ihrer Klasse zugreifen.
quelle
foo['random']
Sie feststellen können, was Ihr Code nicht kann.Verwenden Sie einen Proxy. Es wurde an anderer Stelle in den Antworten erwähnt, aber ich denke, dass dies ein besseres Beispiel ist:
quelle
Da der Operator für Klammern tatsächlich der Operator für den Zugriff auf Eigenschaften ist, können Sie ihn mit Getter und Setter einbinden. Für IE müssen Sie stattdessen Object.defineProperty () verwenden. Beispiel:
Gleiches gilt für IE8 +:
Für IE5-7 gibt es
onpropertychange
nur Ereignisse, die für DOM-Elemente funktionieren, nicht jedoch für andere Objekte.Der Nachteil der Methode besteht darin, dass Sie nur Anforderungen an vordefinierte Eigenschaften festlegen können, nicht an beliebige Eigenschaften ohne vordefinierten Namen.
quelle
obj['any_key'] = 123;
aber was ich in Ihrem Code sehe, muss ich für jeden (noch nicht bekannten) Schlüssel Setter / Getter definieren. Das ist unmöglich.Sie müssen Proxy verwenden , wie erklärt, aber es kann schließlich in eine Klasse integriert werden Konstruktor
mit diesem'. Dann werden die Funktionen set und get (auch deleteProperty) ausgelöst. Obwohl Sie ein Proxy-Objekt erhalten, das anders aussieht, fragt es zum größten Teil nach dem Vergleichstyp (target.constructor === MyClass) nach dem Klassentyp usw. [obwohl es sich um eine Funktion handelt, bei der target.constructor.name der Klassenname ist Text (nur ein Beispiel für Dinge, die etwas anders funktionieren.)]
quelle
Sie hoffen also, so etwas wie var Whatever = MyClassInstance [4] zu tun; ? Wenn ja, ist die einfache Antwort, dass Javascript derzeit das Überladen von Operatoren nicht unterstützt.
quelle
Ein hinterhältiger Weg, dies zu tun, besteht darin, die Sprache selbst zu erweitern.
Schritt 1
Definieren Sie eine benutzerdefinierte Indizierungskonvention. Nennen wir sie "[]".
Schritt 2
Definieren Sie eine neue Evaluierungsimplementierung. (Tun Sie dies nicht so, aber es ist ein Proof of Concept).
Das Obige funktioniert nicht für komplexere Indizes, kann jedoch mit einer stärkeren Analyse durchgeführt werden.
Alternative:
Anstatt Ihre eigene Obermenge zu erstellen, können Sie stattdessen Ihre Notation mit der vorhandenen Sprache kompilieren und dann bewerten. Dies reduziert den Parsing-Overhead nach der ersten Verwendung auf native.
quelle
Wir können Proxy bekommen | Methoden direkt einstellen . Davon inspiriert .
quelle