是否可以使用字符串创建新对象? 例如,如何将字符串“product”转换为var p = new Product
?从字符串创建对象
在此先感谢。
编辑
我想要做的是有一个菜单<a href="#home"></a><a href="#products">products</a>
从HREF每次创建相应的对象。
是否可以使用字符串创建新对象? 例如,如何将字符串“product”转换为var p = new Product
?从字符串创建对象
在此先感谢。
编辑
我想要做的是有一个菜单<a href="#home"></a><a href="#products">products</a>
从HREF每次创建相应的对象。
如果你知道上下文,是的。假设您在浏览器环境中,并且Person
是全局构造函数。因为任何全局变量是全局对象的属性,这意味着你可以通过全局对象window
访问Person
:
var p = new Person()
等同于:
var p = new window.Person()
所以,你可以用方括号符号:
var p = new window["Person"]();
当然这对每一种物体都是有效的。如果你不想污染全球范围内,你可以有:
var mynamespace = {};
mynamespace.Person = function Person() {..}
var p = new mynamespace["Person"]();
这是比我的更好的解决方案+1 – 2012-03-21 11:57:11
我尝试使用新窗口[“Namespace.MyClass”]()创建对象,但看起来不起作用。我们如何在类包含模块时创建对象? – 2014-01-09 15:50:07
@NarendraV尝试新窗口[“命名空间”] [“MyClass”]()?(这只是一个猜测,我不知道这会起作用) – 2014-01-10 11:53:27
那么你总是可以使用可怕的不安全和illadvised eval()。 例如
var myStr = "Product"
var p = eval("new " + myStr + "()");
,或者可能是:
var myStr = "Product"
eval("var p = new " + myStr + "()");
但它充满了潜在的漏洞,特别是如果字符串是从用户输入的到来。
尝试在eval中搜索“use strict” – Joseph 2012-03-21 11:50:00
这可以通过名称 - >构造函数映射更好地解决。 – 2012-03-21 11:54:01
+1当程序生成输入时,完美 – smirkingman 2013-05-02 19:41:22
只是另一种实现方式:
var nameOfThang = 'Person';
var nameOfThingzName = 'The Dude';
var thangs = { Person: {name: 'Legowski'}, Cars: {} };
var person = new (eval(thangs[nameOfThang].constructor))();
person.name = new (eval(thangs.Person.name.constructor))(nameOfThingzName) .toString();
console.log('@thang, #Person', person);
你希望用它做什么? – Joseph 2012-03-21 11:44:02
将'product'转换为'var p = new Product'的规则是什么?我可以理解'新产品',但为什么'p'? – 2012-03-21 11:44:31
@christ:这听起来很危险,特别是如果字符串来自用户...为什么你认为这是一个好主意?你有没有考虑过其他方法? – 2012-03-21 11:44:55