2012-07-13 76 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关键字创建者之外功能。