Umgehung: JavaScript-Wörterbuch, das Objekte als Schlüssel akzeptiert

8

Ich lese ein paar Fragen und Antworten zu JavaScript-Wörterbuchimplementierungen, aber sie erfüllen meine Anforderungen nicht:

  • Das Wörterbuch muss Objekte als Schlüssel aufnehmen können
  • Die Werte müssen für den [] -Operator
  • zugänglich sein

Also kam ich auf die Idee, die "valueOf" -Methode in Object.prototype wie folgt zu überschreiben:

%Vor%

Ich habe das mit google-chrome getestet und es scheint gut zu funktionieren, aber ich bin ein wenig skeptisch, ob dies einige Nachteile haben wird, da es so einfach zu implementieren war.

Wenn Sie bedenken, dass die valueOf-Methode nicht für andere Zwecke im gesamten Code verwendet wird, glauben Sie, dass es irgendwelche Nachteile gibt?

    
fishbone 27.07.2010, 15:56
quelle

3 Antworten

5

Es ist eine interessante Idee. Ich schlage meine jshashtable vor. Es erfüllt Ihre erste Anforderung, aber nicht die zweite. Ich sehe nicht wirklich den Vorteil, darauf zu bestehen, die Zugriffsnotation der eckigen Klammereigenschaft zu verwenden: Haben Sie eine besondere Anforderung dafür?

Mit jshashtable können Sie dem Konstruktor Hashtable eine Hashfunktion bereitstellen. Diese Funktion wird an ein Objekt übergeben, das als Schlüssel verwendet werden soll, und muss eine Zeichenfolge zurückgeben. Sie könnten eine Funktion verwenden, die nicht unähnlich ist zu dem, was Sie dort haben, ohne Object.prototype zu berühren.

Es gibt einige Nachteile für Ihre Idee:

  1. Ihre valueOf -Methode wird in einer for...in -Schleife über jedem nativen Objekt angezeigt;
  2. Sie haben keine Möglichkeit zu bestimmen, welche Schlüssel als gleich betrachtet werden sollten, was Sie vielleicht tun möchten. Stattdessen werden alle Schlüssel als einmalig betrachtet.
  3. Dies funktioniert nicht mit Host-Objekten (d. h. von der Umgebung bereitgestellten Objekten wie DOM-Elementen)
Tim Down 27.07.2010, 16:43
quelle
2

Es ist eine interessante Frage, weil ich bisher angenommen habe, dass jedes Objekt als Index verwendet werden kann (aber nie mit assoziativen Arrays versucht wurde). Ich weiß zwar nicht genug über die Funktionsweise von JavaScript, aber ich würde wetten, dass valueOf irgendwo anders verwendet wird als JavaScript, auch wenn es nicht in Ihrem Code enthalten ist. Sie könnten später auf scheinbar unerklärliche Probleme stoßen. Zumindest würde ich mich auf eine neue Klasse beschränken und Object in Ruhe lassen;) Oder Sie nennen Ihre Hashing-Funktion explizit myHash () oder was auch immer und rufen z [x.myHash ()] auf, was Unordnung hinzufügt, aber lassen würde ich, persönlich, schlafe besser;) Ich kann nicht widerstehen, zu denken, dass es eine mehr JavaScript-bewusste Lösung dafür gibt, also bedenken Sie all diese hässlichen Umgehungslösungen;)

    
Nicolas78 27.07.2010 16:07
quelle
0

Wenn Sie auf diese Frage stießen und nach einem JS-Wörterbuch suchen, in dem Objekte Schlüssel sind, sehen Sie sich die Karte Map an vs Objekt in JavaScript

    
Ivan Koshelev 10.03.2018 19:41
quelle