我有一个Factory类,我在JavaScript中使用它通过AJAX动态加载类文件,然后返回一个对象。我在系统中遇到了一个非常奇怪的错误,虽然这会在每个浏览器中引发错误,但是在我无法解释的情况下会出现错误。
这是我的Factory类的简化版本(我删除了很多类型检查和错误处理,以将其降低到最低限度。)
function Factory(){
// This holds which files have already been loaded
var loaded=new Object();
// Returns a new object
this.getObject=function(className,methodName,methodData){
if(loadFile('class.'+className+'.js')){
// Making sure that the object name is defined
if(window[className]!=null){
// Has to be an object
if(typeof(window[className])=='function'){
// Creating a temporary object
return new window[className];
}
}
}
}
// Loads a file over AJAX
var loadFile=function(address){
// Loads as long as the file has not already been loaded
if(loaded[address]==null){
// Required for AJAX connections (without ASYNC)
var XMLHttp=new XMLHttpRequest();
XMLHttp.open('GET',address,false);
XMLHttp.send(null);
// Result based on response status
if(XMLHttp.status===200 || XMLHttp.status===304){
// Getting the contents of the script
var data=XMLHttp.responseText;
// Loading the script contents to the browser
(window.execScript || function(data){
window['eval'].call(window,data);
})(data);
// makes sure that file is loaded only once
loaded[address]=true;
}
}
}
这是用户所做的:
var Factory=new Factory();
var alpha=Factory.getObject('example');
alpha.set(32);
alpha.get();
var beta=Factory.getObject('example');
beta.set(64);
alpha.get();
beta.get();
这失败了,当第二次运行该函数时(在return new window[className];
行),它表示“对象不是函数”。我知道如果我在这里遗漏了什么,但这里是踢球者:
如果我在className
次来电中加window[]
前缀,则可行。例如,如果我将'example'
类文件名更改为'test_example'
,然后将这些行:
... if(window['test_'+className]!=null){ ...
... if(typeof(window['test_'+className])=='function'){ ...
... return new window['test_'+className]; ...
然后它工作,alpha和beta对象都按预期工作。当我纯粹通过变量引用它们时,它们会失败。我尝试了类似className.toString()的事情但没有成功,甚至失败了:
className+''
这真的很奇怪,我不知道在哪里看,还有什么可以尝试,有谁知道为什么会这样?
编辑:以下是正在加载的'example.js'脚本的示例:
function example(){
var myVar=16;
this.set=function(value){
myVar=value;
}
this.get=function(){
alert(myVar);
}
}
(如果我将其重命名为test_example()并使用构造的字符串加载如上所示的函数,则它再次起作用)
答案 0 :(得分:0)
我弄清楚错误的位置,我上面的缩减版本没有显示。显然我将我的新变量命名为类本身的名称,因此在首次初始化后它被覆盖了。