Wie kann ich JavaScript-Objekt mit einem String-variable zu definieren, die den Namen der Klasse?
Hier ist, was ich versuche zu tun-das ist pseudo-code und funktioniert nicht. Weiß jemand, wie man diese Aufgabe für real:
//Define the class
MyClass = Class.extend({});
//Store the class name in a string
var classNameString = 'MyClass';
//Instantiate the object using the class name string
var myObject = new classNameString();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würde es funktionieren, wenn Sie so etwas Tat:
..?
window[classNameString]
(ohne Anführungszeichen). Bricht sobaldMyClass
bewegt wird, um eine niedrigere (d.h.function
) Umfang. @kirk: ja, das ist ein cross-browser.window[classNameString](args)
. Aber als Halbmond Frische erwähnt, vorsichtig sein, da diese brechen könnte in einigen Fällen.require([myModuleName], function(myModule) { var myModuleInstance = new myModule(); });
womyModuleName
ist die Zeichenfolge, die den Namen der Klasse möchte ich zu instanziieren.window
Objekt in node.js. Und das war nicht wirklich Teil der Frage entweder. Ich denke, es sollte funktionieren mit derglobal
Objekt in node.js stattwindow
nodejs.org/api/globals.htmlvar obj = new Home(id);
, dann aber dies nicht:var obj = new window["Home"](id);
. Ich bin versucht, diese zu arbeiten:new window[x](id);
wox = "Home"
... Der Fehler bin ich immerUncaught TypeError: window[x] is not a constructor
window[prop.pipeVal]('en-US')
Hier ist eine robustere Lösung, die die Arbeit mit Namespaces Funktionen:
Beispiel:
(windows || this)
, nicht-Fensters immer definiert werden?window || this
zurückkehren können undefined in einem nicht-browser-Umgebung, wenn das ist nicht festgelegt, durch den Aufruf (was es nicht ist in dem Beispiel).BTW: Fenster ist die Referenz auf das Globale Objekt im JavaScript. Das ist auch
this
, und sollte auch in nicht-browser-Umgebungen wie Node.js, Chrome-Erweiterungen, transpiled code etc.var obj = new this[classNameString]();
Die Einschränkung ist, dass die aufgerufene Klasse muss sich im globalen Kontext. Wenn Sie möchten, um denselben zu einem Gültigkeitsbereich von Klasse, die Sie tun müssen:
var obj = (Function('return new ' + classNameString))()
Jedoch, es gibt wirklich keinen Grund für die Verwendung eines string. JavaScript-Funktionen sind selbst Objekte, wie strings, die Objekte auch.
Bearbeiten
Hier ist ein besserer Weg, um die Globale Reichweite, das funktioniert im strict-Modus als auch nicht-browser-JS-Umgebungen:
Aus: Wie man das Globale Objekt im JavaScript?
this
bei Aufruf aus einem globalen Kontext.window
funktioniert unabhängig von dem Kontext, die Sie in sind, so sehe ich keinen Grund zu bevorzugenthis
überwindow
.this
ist vorzuziehen, weil in einer nicht-browser-Umgebungwindow
undefiniert sein kann, oder nicht, was Sie erwarten.window
überthis
.this
, nichtwindow
. Außerdem ist die zuverlässigste Weg, um auf den globalen Kontext NICHT aus dem globalen Kontext isttop
. Auch vielleicht gut zu injizieren es in die Schließung.Function('return this')()
stattreturn this
. Der ehemalige wechselt automatisch in den globalen Kontext. Dies funktioniert unabhängig vom Kontext. Fenster können überschrieben werden, und ist nur browser. Es ist gut, um nicht zu wissen, code Ausführungskontext zu schreiben, cross-Plattform-code. Die Antwort, die ich gab, ist cross-Plattform und kann nicht überschrieben werden, und daher viel besser als mitwindow
. Es funktioniert in transpiled-code, wie mit webpack, schlucken und in den Knoten, Erweiterungen etc. Bitte testen Sie es zuerst.window
ohne Probleme mitwindow
. Der Kontext des Aufrufs kann jeder Rahmen.Wenn MyClass ist global, Sie können es als eine Eigenschaft des window-Objekts (vorausgesetzt, dass Ihr code läuft im browser) mit subskript-notation.
Wenn
classNameString
kommen aus sicheren Quelle, die Sie verwenden können,Diese Lösung arbeitet mit namespaces und ist unabhängig von der Plattform (browser/server).
eval
öffnet ein Sicherheits-Risiko für die client-Seite Benutzer. Es sei denn, Sie sind mit javascript, die in geschlossene Produktion, der beste Rat ist, nicht zu verwendeneval
. Es ist gute Praxis, nicht verwenden es in Erster Linie, weil es vielleicht eine schlechte Gewohnheit geworden.eval
wenn Sie habe gehört, dass es eine schlechte Idee ist wie betrunken fahren. "Es ist nichts passiert ...hic... das Letzte mal fuhr ich trinken ..hic.. in der Tat ich fahre betrunken besser! ...hic..." mit der Zeit etwas schief geht, ist es zu spät. Nicht den Kerl.Hier ist die verbesserte version von Yuriy ' s Methode, die auch Griffe Objekte.