只需删除引号(并在var 后添加一个空格):
var MyObject = of.createObject(MyObjectClassName);
(如果您真的想要使用字符串,请参阅下文。)
完整示例:Live Copy
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Example</title>
<style>
body {
font-family: sans-serif;
}
</style>
</head>
<body>
<script>
(function() {
"use strict";
var ObjectFactory = function(){
};
ObjectFactory.prototype.createObject = function(ctor){
return new ctor;
};
function Foo() {
}
var of = new ObjectFactory();
var f = of.createObject(Foo);
display("<code>f instanceof Foo</code>? " + (f instanceof Foo));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>
如果你真的需要在那里使用字符串而不是函数引用,那么除非你想使用eval(通常最好避免),否则你需要一个对象来查找构造函数(例如,从字符串名称中获取构造函数)。
如果构造函数是globals,你可以在全局对象上查找它们,但全局是个坏主意。相反,给自己一个地图对象并将构造函数设置为地图的属性:
var constructorMap = {
MyObjectClassName: MyObjectClassName
};
你甚至可以把它放在 `ObjectFactory:
ObjectFactory.constructorMap = {
MyObjectClassName: MyObjectClassName
};
然后
ObjectFactory.prototype.createObject = function(objectName){
return new ObjectFactory.constructorMap[objectName];
};
完整示例:Live Copy
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Example</title>
<style>
body {
font-family: sans-serif;
}
</style>
</head>
<body>
<script>
(function() {
"use strict";
function Foo() {
}
var ObjectFactory = function(){
};
ObjectFactory.constructorMap = {
Foo: Foo
};
ObjectFactory.prototype.createObject = function(objectName){
return new ObjectFactory.constructorMap[objectName];
};
var of = new ObjectFactory();
var f = of.createObject("Foo");
display("<code>f instanceof Foo</code>? " + (f instanceof Foo));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>