Creare un’istanza di un object JavaScript utilizzando una stringa per definire il nome della class

Ecco cosa sto cercando di fare – questo è pseudo codice e non funziona. Qualcuno sa come farlo per davvero:

// 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(); 

Funzionerebbe se facessi qualcosa del genere:

 var myObject = window[classNameString]; 

..?

Ecco una soluzione più solida che funzionerà con le funzioni dei nomi:

 var stringToFunction = function(str) { var arr = str.split("."); var fn = (window || this); for (var i = 0, len = arr.length; i < len; i++) { fn = fn[arr[i]]; } if (typeof fn !== "function") { throw new Error("function not found"); } return fn; }; 

Esempio:

 my = {}; my.namespaced = {}; (my.namespaced.MyClass = function() { console.log("constructed"); }).prototype = { do: function() { console.log("doing"); } }; var MyClass = stringToFunction("my.namespaced.MyClass"); var instance = new MyClass(); instance.do(); 

BTW: finestra è il riferimento all’object globale nel browser JavaScript. Che è anche this , e dovrebbe funzionare anche in ambienti non browser come Node.js, estensioni di Chrome, codice transpiled ecc.

var obj = new this[classNameString]();

La limitazione è che la class chiamata deve essere nel contesto globale. Se si desidera applicare lo stesso a una class con ambito, è necessario:

var obj = (Function('return new ' + classNameString))()

Tuttavia, non c’è davvero alcun motivo per usare una stringa. Le funzioni JavaScript sono esse stesse oggetti, proprio come le stringhe che sono anche oggetti.

modificare

Ecco un modo migliore per ottenere l’ambito globale che funziona in modalità rigorosa e in ambienti JS non browser:

 var global; try { global = Function('return this')() || (42, eval)('this'); } catch(e) { global = window; } // and then var obj = new global[classNameString] 

Da: come ottenere l’object globale in JavaScript?

Se MyClass è globale, puoi accedervi come una proprietà dell’object window (supponendo che il tuo codice sia eseguito in un browser) usando la notazione del pedice.

 var myObject = new window["MyClass"](); 

Ecco una versione migliorata del metodo di Yuriy che gestisce anche gli oggetti.

 var stringToObject = function(str, type) { type = type || "object"; // can pass "function" var arr = str.split("."); var fn = (window || this); for (var i = 0, len = arr.length; i < len; i++) { fn = fn[arr[i]]; } if (typeof fn !== type) { throw new Error(type +" not found: " + str); } return fn; }; 

Se classNameString proviene da fonti sicure, puoi utilizzare

 var classNameString = 'MyClass'; var myObject = eval("new " + classNameString + "()"); 

Questa soluzione funziona con namespace ed è indipendente sulla piattaforma (browser / server).