2016-08-05 36 views
0

So mache ich das zur Zeit in meinem Js-Skript:Wie verwendet man Js und assoziative Arrays, die einen String einfügen?

var someObject = require('./stored'); 
this.makeDuplicates = function(){ 
    var storeDuplicates = []; 

    this.addDuplicates = function(astring){ 
     storeDuplicates[astring] = new someObject(); 
    } 

    this.printDuplicate = function(){ 
     console.log(storeDuplicates["hello"]); 
    } 
} 
var input = "hello" 
var newDupe = new makeDuplicates() 
newDupe.addDuplicates(input) 
newDupe.printDuplicate() 

diese dann nicht definiert gedruckt werden. Warum wird das nicht richtig gemacht? Ich würde annehmen, es würde eine Hash-ähnliche Tabelle erstellen, in der "string" -> ref zu objekt, aber es scheint nicht so. Wie kann ich das tun? Vielen Dank!

+0

var someObject = function() {this.x = 1}; und dann irgendeinObject {x: 1} kein Fehler, nicht undefiniert, ist es erforderlich ('./ gespeichert') ein Konstruktor? Dennoch ist es besser var storeDuplicates = {} anstelle von [] zu verwenden, da Sie als Hash-Tabelle verwenden, in js ist es Objekt –

+0

@YanjunLin: 'require()' ist eine Funktion in node.js zum Importieren anderer Module – slebetman

+0

Sie Es wird entweder nicht der gesamte Code angezeigt, oder der Code selbst ist weit entfernt. Wie gezeigt, wird "this" wahrscheinlich zu "window" (der globale Kontext von javascript) im Vergleich zum Prototyp von Object –

Antwort

1

Erstens, wenn Sie nicht eine listenähnliche Sache verwenden möchten, verwenden Sie keine Arrays, verwenden Sie Objekte. Im Gegensatz zu anderen Sprachen sind JavaScript-Objekte erweiterbar. Das heißt, Sie können Objektinstanzen immer neue Methoden und Eigenschaften hinzufügen. Daher haben Javascript keine Hashes, da sich Objekte in einer Hash-ähnlichen Weise verhalten. Um Objekte einfach mit Hilfe von Javascript hat Objektliteral Syntax:

var storeDuplicates = {}; // object to act as a hash 

Zweitens, entfernen Sie die this von Ihrem Konstruktor:

makeDuplicates = function(){ /*... */ }; 

Alles andere sollte funktionieren, wie Sie erwarten, dass sie zu.

Sehen Sie diese ähnliche Frage wie this Werke in javascript: How does the "this" keyword in Javascript act within an object literal?


nun die folgenden nur beratende, wird Ihr Code noch ohne sie funktionieren, aber andere Javascript-Programmierer es unkonventionell finden.

Da Konstruktoren (im klassischen JavaScript, Konstruktoren wie Klassen in anderen Sprachen) nur Funktionen sind, gibt es keinen syntaktischen Unterschied zwischen Konstruktoren und anderen Funktionen. Um Abhilfe zu schaffen javascript eine Konvention, wo Konstruktor Namen immer mit Großbuchstaben beginnen entwickelt hat:

MakeDuplicates = function(){ /* ... */ }; 

Wenn ein JavaScript-Programmierer die oben sieht er wird verstehen, dass die MakeDuplicates Funktion soll ein Konstruktor sein.

+0

ein Array _ist_ ein Objekt, also obwohl es etwas albern ist zu tun: var x = [ ]; x ['prop'] = 'irgendwas', es funktioniert nicht anders als var x = {} –

+0

@jameygraham: Ja, aber wenn du nie vorhast, das Array als ein Array zu benutzen, mache es besser zu einem Objekt, da es deutlicher zeigen würde deine Absicht. Wenn ich ein Stück Code mit einem Array ansehen würde, das niemals als Array verwendet wird, und wenn ich weiß, dass der Autor ein erfahrener js-Programmierer ist, würde ich annehmen, dass irgendwo ein Fehler liegt, den der Autor versehentlich gelöscht hat Code. Außerdem funktioniert es in einigen Fällen anders. Wenn Sie 'JSON.stringify (x)' haben, erhalten Sie '" [] "' anstelle von '{" prop ":" something "}'. Dann werden wir jemanden fragen, der hier eine Frage stellt, warum sein JSON ein leeres Array ist. – slebetman

+0

Ich bin nicht anderer Meinung über den Punkt, dass = [] schlecht ist. Ich folge dieser Antwort immer noch nicht ganz - zu dem Zeitpunkt wird "this.addDuplicates" ausgewertet, "this" zeigt auf window (und es wird nur einmal ausgewertet ... es ist nicht wie "this" in anderen verwendet) Funktion). die Frage bleibt unklar –

0

Also ging ich einfach zurück zu meinem Code und erkannte, dass ich einen extrem sorglosen Fehler mache. Anstelle von newDupe.addDuplicates (Eingabe) hatte mein tatsächlicher Code newDupe.addDuplicates ("anon") daher das undefined. Trotzdem lese ich den richtigen Gebrauch davon. .