我有3个js文件。
object.js constains跟随对象,
function User()
{
//Some property
}
function Employee()
{
// Some Property
}
..等等。
和Framework.js,我们需要在其中创建一个方法CreateInstance(objectname)。
我们需要以这样的方式创建此方法:使用createinstance方法的人只需要传递其所需实例的objectname。因此,将来如果在object.js中添加了任何对象,createinstance应该能够在不修改CreateInstance方法的情况下基于ObjectName创建该对象的实例。
function CreateInstance(objectName)
{
//logic for creating instance of object.
}
可能吗?如何?
答案 0 :(得分:1)
使用eval
的一位有条不紊的人。
function CreateInstance(objectName) {
return new (eval(objectName))();
}
如果您想要安全,可以添加一些验证以确保objectName
是一个单词并且eval(objectName)
是一个函数。
答案 1 :(得分:1)
如果您想通过提供字符串来创建实例(这就是我解释您的问题的方式),您可以随时使用eval
:
function CreateInstance(objectName) {
return eval("new " + objectName + "()");
}
答案 2 :(得分: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
答案 3 :(得分:0)
为什么不使用new
运算符?您可以使用目前这样的:
var user = new User();
alert(user instanceof User); // Shows "true"
答案 4 :(得分:0)
我认为你正试图拥有像Factory Pattern这样的东西。 有不同的方法可以做到这一点。但是根据上面给出的陈述,你似乎有点不对劲。
Javascript是一种基于函数的语言,其中函数表示对象本身(换句话说,类似于结构的类)。
编写函数后,您已经创建了一个对象。
您始终可以使用新关键字创建对象。
直接使用新关键字的原因是“它是全球性的考虑因素”。即如果它在系统内的任何时间提到,你可以从任何地方全局访问一个对象
答案 5 :(得分:0)
您不需要(也不应该使用)eval
。
var myconstructors = {
User: function(){/*...*/},
Employee: function(){/*...*/}
};
var createinstance = function(name){
return new myconstructors[name]();
};