1

これが現在の私のコードです(不要な要素は明らかに削除されています):

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");
    };
}

これは機能しますが、ではなくbarbar2を割り当てています。どうすればそれらを確実に割り当てることができますか?foofoo[0]foo[0]

4

2 に答える 2

0

myfunc.jsまだインスタンス化されていない匿名JavaScriptクラス(=無名関数)が含まれています。したがって、メインスクリプトでeval()は、そのクラスだけを返します。foo[0]これで、そのクラスのオブジェクトをインスタンス化するために使用できます。クラス名のようなものです。

私のポイントは、(オブジェクトからではなく)クラスからプロパティを取得しようとしているということですが、これはもちろん機能しません。したがって、基本的に問題を解決するための2つのオプションがあります。

  1. によって返される匿名クラスのインスタンスを作成しますeval()

    foo[0] = new (eval("(" + xhr.responseText + ")"));
    console.log(foo[0].bar1);
    
  2. からのクラスの代わりに(シングルトン)オブジェクトを返しますmyfunc.js

    new function() {
        this.bar1 = "Hello World";
    }
    

ところで、私の意見では、Quentinは、プログラムの構造を再考する必要があると言っている点で良い点があります...

于 2012-10-08T22:09:57.333 に答える
0

自己変更関数を定義する代わりに、(Quentinが提案したように)JSONを使用することになりました。結果myfunc.jsonのファイルは次のようになります。

{
    "bar1": "Hello World",
    "bar2": function()
    {
        console.log("this is bar2");
    }
}

構造に関しては、あまり気になりません。これはLAN上でのみ実行され、実用的で完全に完成したゲームではなく、WebGLについて私が持っていたアイデアを示すことを目的としています。

于 2012-10-10T06:24:10.853 に答える