2012-03-21 112 views
16

是否可以使用字符串创建新对象? 例如,如何将字符串“product”转换为var p = new Product从字符串创建对象

在此先感谢。

编辑

我想要做的是有一个菜单<a href="#home"></a><a href="#products">products</a>从HREF每次创建相应的对象。

+0

你希望用它做什么? – Joseph 2012-03-21 11:44:02

+1

将'product'转换为'var p = new Product'的规则是什么?我可以理解'新产品',但为什么'p'? – 2012-03-21 11:44:31

+0

@christ:这听起来很危险,特别是如果字符串来自用户...为什么你认为这是一个好主意?你有没有考虑过其他方法? – 2012-03-21 11:44:55

回答

60

如果你知道上下文,是的。假设您在浏览器环境中,并且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"](); 
+3

这是比我的更好的解决方案+1 – 2012-03-21 11:57:11

+0

我尝试使用新窗口[“Namespace.MyClass”]()创建对象,但看起来不起作用。我们如何在类包含模块时创建对象? – 2014-01-09 15:50:07

+0

@NarendraV尝试新窗口[“命名空间”] [“MyClass”]()?(这只是一个猜测,我不知道这会起作用) – 2014-01-10 11:53:27

6

那么你总是可以使用可怕的不安全和illadvised eval()。 例如

var myStr = "Product" 
var p = eval("new " + myStr + "()"); 

,或者可能是:

var myStr = "Product" 
eval("var p = new " + myStr + "()"); 

但它充满了潜在的漏洞,特别是如果字符串是从用户输入的到来。

+0

尝试在eval中搜索“use strict” – Joseph 2012-03-21 11:50:00

+2

这可以通过名称 - >构造函数映射更好地解决。 – 2012-03-21 11:54:01

+0

+1当程序生成输入时,完美 – smirkingman 2013-05-02 19:41:22

1

只是另一种实现方式:

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