如何在object名称的基础上创建javascript对象的实例

How to create instance of javascript object on the basic of Object name

本文关键字:基础上 创建 对象 实例 javascript object      更新时间:2023-09-26

我有3个js文件。

object.js固定在对象后面,

function User()
{
 //Some property
}
function Employee()
{
 // Some Property
}

和There Framework.js,我们需要在其中创建一个方法CreateInstance(objectname)。

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

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

这可能吗?怎么可能?

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

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

eval的合法使用。

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

如果您希望安全,可以添加一些验证以确保objectName是一个单词,eval(objectName)是一个函数。

只要在窗口范围内定义了用户和员工,以下内容就应该有效:

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

为什么不直接使用new运算符?你现在可以这样使用:

var user = new User();
alert(user instanceof User); // Shows "true"

我认为您正在尝试使用类似Factory Pattern的东西。做这件事有不同的方法。但根据上面的说法,你似乎有点错了。

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

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

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

直接使用new关键字的原因是"it a Global Considered Lang"。即,如果对象在系统中的任何时间引用,则可以从任何地方全局访问该对象

您不需要(也不应该使用)eval

var myconstructors = {
    User: function(){/*...*/},
    Employee: function(){/*...*/}
};
var createinstance = function(name){
    return new myconstructors[name]();
};