这是我正在尝试做的 - 这是伪代码,不起作用.有谁知道如何实现这一目标:
// 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();
Run Code Online (Sandbox Code Playgroud)
pei*_*rix 61
如果你做了这样的事情,它会工作:
var myObject = window[classNameString];
Run Code Online (Sandbox Code Playgroud)
..?
Yur*_*sov 56
这是一个更强大的解决方案,可以使用命名空间函数:
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;
};
Run Code Online (Sandbox Code Playgroud)
例:
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();
Run Code Online (Sandbox Code Playgroud)
buc*_*bay 29
BTW:window是浏览器JavaScript中对全局Object的引用.这也是this,甚至应该在非浏览器环境中工作,例如Node.js,Chrome扩展,转换代码等.
var obj = new this[classNameString]();
限制是被调用的类必须在全局上下文中.如果要将其应用于作用域类,则需要执行以下操作:
var obj = (Function('return new ' + classNameString))()
但是,确实没有理由使用字符串.JavaScript函数本身就是对象,就像字符串一样也是对象.
这是获得在严格模式和非浏览器JS环境中工作的全局范围的更好方法:
var global;
try {
global = Function('return this')() || (42, eval)('this');
} catch(e) {
global = window;
}
// and then
var obj = new global[classNameString]
Run Code Online (Sandbox Code Playgroud)
Che*_*try 11
如果MyClass是全局的,您可以使用下标表示法将其作为window对象的属性(假设您的代码在浏览器中运行)进行访问.
var myObject = new window["MyClass"]();
Run Code Online (Sandbox Code Playgroud)
如果classNameString来自安全来源,您可以使用
var classNameString = 'MyClass';
var myObject = eval("new " + classNameString + "()");
Run Code Online (Sandbox Code Playgroud)
此解决方案适用于命名空间并且独立于平台(浏览器/服务器)。
浏览器全局对象是window,每当您使用 定义全局变量var或使用 函数时function,您都会将它们添加到 中window。因此你可以在那里得到你的“类”定义:
var args = [];
var className = 'MyClass';
var obj = new window[className](args);
Run Code Online (Sandbox Code Playgroud)
但这不适用于 ES6 类声明
使用 ES6 关键字声明的类class根据标准进行不同的处理。
用 声明的类class MyClass { }定义了一个全局类,该类不会成为window全局对象的属性。换句话说,以下内容适用
class MyClass {};
typeof window.MyClass === 'undefined';
Run Code Online (Sandbox Code Playgroud)
那么,如何对 ES6 类执行同样的操作呢?需要对象访问符号,因为这是解析字符串名称所需的,但要搜索的父对象不再可用。
一种方法是创建您自己的上下文对象,在那里声明您的类并在那里搜索它。在代码中:
// this variable actually goes in `window`
var classes = {};
// declare class inside
classes.MyClass = class {
// the class code
};
var args = [];
var className = 'MyClass';
var obj = new classes[className](args); // dynamic for "new classes.MyClass(args)"
Run Code Online (Sandbox Code Playgroud)
function myClass(arg){
}
var str="myClass";
dynamic_class=eval(str);
var instance=new dynamic_class(arg); // OK
Run Code Online (Sandbox Code Playgroud)
编辑:内联示例
function Person(name){
this.name=name;
}
var person1=new (eval("Person"))("joe");
Run Code Online (Sandbox Code Playgroud)