2012-07-13 71 views
0

我有一個JavaScript「模塊」訪問項目(我們稱他們在python)在一個名爲thing.js:不能在JavaScript關聯數組

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

的代碼是有點不完整的,我想隨機挑選兩件東西並返回。但這不是直接的問題。

我有一個單獨的 「主」 javascript文件名爲main.js,這就要求對這些對象和功能:

$div1.append(random_thing()); 

在我的html文件,我包括JavaScript文件:

​​

但我不斷收到的輸出是「未定義」的警報(東西['一'])!我不明白第一個警報如何返回undefined,它正好在關聯數組的定義之下。

回答

3

調用Thing()不會做任何事情你比重整的window性能等。您正在尋找new Thing()

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

如果你調用一個「類」的功能,而無需使用new關鍵字,然後this將參照window全局對象,這無形中保證事情會出差錯 - 有些時候這麼可怕。當你使用new關鍵字,this將引用一個全新的對象,將自動返回。

這是用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關鍵字創建者之外功能。