这是我目前的代码(显然删除了不必要的元素):
var foo = new Array();
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200)
{
foo[0] = eval("(" + xhr.responseText + ")");
// After this point, I want to be able to reference
// foo[0].bar1
// and
// foo[0].bar2()
}
}
xhr.open("GET", "myfunc.js", true);
xhr.send();
这是myfunc.js
的内容,但它不起作用。
function() {
this.bar1 = "Hello World";
this.bar2 = function()
{
console.log("this is bar2");
};
}
这有效,但它将bar
和bar2
分配给foo
而不是foo[0]
。如何确保将其分配给foo[0]
?
答案 0 :(得分:0)
myfunc.js
包含一个尚未实例化的匿名JavaScript类(=匿名函数)。因此,在您的主脚本中,eval()
仅返回该类。 foo[0]
现在可用于实例化该类中的对象;它类似于班级名称。
我的观点是你试图从一个类(而不是一个对象)获取属性,这当然不起作用。所以你基本上有两个选择来解决这个问题:
创建eval()
返回的匿名类的实例:
foo[0] = new (eval("(" + xhr.responseText + ")"));
console.log(foo[0].bar1);
从myfunc.js
返回一个(单例)对象而不是一个类:
new function() {
this.bar1 = "Hello World";
}
顺便说一句,在我看来,Quentin说你应该重新考虑你的程序结构......
答案 1 :(得分:0)
我最终使用JSON(如Quentin所建议的)而不是定义自修改功能。
我生成的myfunc.json
文件如下所示:
{
"bar1": "Hello World",
"bar2": function()
{
console.log("this is bar2");
}
}
至于结构,我并不过分关注它。它只在局域网上运行,旨在展示我对WebGL的一个想法,而不是一个实用的,完全完成的游戏。