使用string实例化JavaScript对象以定义类名
这是我想要做的 – 这是伪代码,不起作用。 有谁知道如何做到这一点:
// 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();
如果你做了这样的事情,它会工作吗:
var myObject = window[classNameString];
..?
这是一个更强大的解决scheme,将使用命名空间函数:
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; };
例:
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:window是浏览器JavaScript中对全局对象的引用。 这也是this
,即使在非浏览器环境,如Node.js,Chrome扩展,编译代码等,也应该工作。
var obj = new this[classNameString]();
限制是被调用的类必须在全局上下文中。 如果您想要将其应用于范围内的类,则需要执行以下操作:
var obj = (Function('return new ' + classNameString))()
但是,真的没有理由使用一个string。 JavaScript函数本身就是对象,就像string也是对象一样。
编辑
这里有一个更好的方法来获得在严格模式下工作的全局作用域以及非浏览器JS环境:
var global; try { global = Function('return this')() || (42, eval)('this'); } catch(e) { global = window; } // and then var obj = new global[classNameString]
从: 如何获取JavaScript中的全局对象?
如果MyClass是全局的,可以使用下标符号作为窗口对象的属性(假设代码在浏览器中运行)访问它。
var myObject = new window["MyClass"]();
尤里的方法的改进版本也处理对象。
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; };
如果classNameString
来自classNameString
,您可以使用
var classNameString = 'MyClass'; var myObject = eval("new " + classNameString + "()");
此解决scheme与名称空间一起工作,并且在平台(浏览器/服务器)上是独立的。