0

私はthing.jsというファイルにjavascript「モジュール」(Pythonでそれらを呼んでいます)を持っています:

function Thing(){
this.a = "foo";
this.b = "bar";
this.c = "";

this.d = function(){
    this.c = this.a + this.b;
};
};

var things = {
'one':Thing(),
'two':Thing(),
'three':Thing()
};
alert(things["one"]); // output: undefined!!??

/* Pick out two random items from things. */
var random_thing = function(){
    //var grabbed = 0;
    //while(grabbed < 1){
var pick = getRandomInt(0,2);
alert(things["one"]); // output: undefined!!
    //if ()
    //return pick;
};

コードが少し不完全です。ランダムに2つのアイテムを選び、それらを返したいと思います。しかし、それは当面の問題ではありません。

main.jsという別の「メイン」JavaScriptファイルがあります。このファイルはこれらのオブジェクトと関数を呼び出します。

$div1.append(random_thing());

私のhtmlファイルには、両方のjavascriptファイルを含めています。

<script type="text/javascript" src="thing.js"></script>
<script type="text/javascript" src="main.js"></script>

しかし、私が取得し続ける出力は、alert(things ['one'])に対して「未定義」です!最初のアラートが未定義を返す方法がわかりません。物事連想配列の定義のすぐ下にあります。

4

1 に答える 1

3

電話をかけることは、プロパティThing()を操作する以外に何もしません。windowあなたが探していますnew Thing()

var things = {
    'one': new Thing(),
    'two': new Thing(),
    'three': new Thing()
};

newキーワードを使用せずに「クラス」関数を呼び出すとthis、グローバルオブジェクトが参照されwindowます。これにより、問題が発生することが事実上保証されます。場合によっては、問題が発生することもあります。キーワードを使用する、自動的に返される新しいオブジェクトを参照します。newthis

これはJavaScriptの「クラス」に共通する問題であり、(私の意見では)クリエーター関数を使用することで回避するのが最善です。

function Thing() {
    this.a = "foo";
    this.b = "bar";
    this.c = "";

    this.d = function(){
        this.c = this.a + this.b;
    };
};
Thing.create = function() {
    return new Thing();
};

var things = {
    'one': Thing.create(),
    'two': Thing.create(),
    'three': Thing.create()
};

ここでの目標newは、作成者関数の外部でキーワードに依存しないことです。

于 2012-07-13T16:33:53.867 に答える