0

我有 3 个 js 文件。

object.js 包含以下对象,

function User()
{
 //Some property
}

function Employee()
{
 // Some Property
}

.. ETC。

还有我们需要在其中创建一个方法 CreateInstance(objectname) 的 Framework.js。

我们需要以这样一种方式创建此方法,即使用 createinstance 方法的人只需要传递他需要的实例的 objectname。所以将来如果在object.js中添加任何对象,createinstance应该能够在ObjectName的基础上创建该对象的实例,而无需修改CreateInstance方法。

function CreateInstance(objectName)
  {
  //logic for creating instance of object.
  }

是否可能以及如何?

4

6 回答 6

1

一种合法使用eval.

function CreateInstance(objectName) {
  return new (eval(objectName))();
}

如果您想要安全,您可以添加一些验证以确保它objectName是一个单词并且是一个函数。eval(objectName)

于 2013-07-07T10:18:54.127 回答
1

如果您想通过提供字符串来创建实例(这就是我解释您的问题的方式),您可以随时使用eval

function CreateInstance(objectName) {
    return eval("new " + objectName + "()");
}
于 2013-07-07T10:19:59.343 回答
1

只要在窗口范围内定义了 User 和 Employee ,以下内容就应该起作用:

function CreateInstance(objectName)
{
    if (typeof window[objectName] == 'function') {
        return new window[name];
    }

    // return null or throw an error ...
}

var user = CreateInstance('User');
console.log(user instanceof User); // true

var employee = CreateInstance('Employee');
console.log(employee instanceof Employee); // true
于 2013-07-07T10:21:02.933 回答
0

为什么不直接使用new运算符?您可以像这样使用当前:

var user = new User();

alert(user instanceof User); // Shows "true"
于 2013-07-07T10:13:21.807 回答
0

我认为您正在尝试拥有类似工厂模式的东西。有不同的方法可以做到这一点。但是根据上面的陈述,你似乎有点不对劲。

Javascript 是一种基于函数的语言,其中函数表示对象本身(换句话说,是类结构)。

一旦你写了一个函数,你就已经创建了一个对象。

您始终可以使用 new 关键字创建对象。

直接使用 new 关键字的原因是“Its a Global Considered Lang”。即,如果它在系统内的任何时间引用,您可以从任何地方全局访问对象

于 2013-07-07T10:33:54.347 回答
0

你不需要(也不应该使用)eval这个。

var myconstructors = {
    User: function(){/*...*/},
    Employee: function(){/*...*/}
};

var createinstance = function(name){
    return new myconstructors[name]();
};
于 2013-07-07T11:00:55.040 回答