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

代码有点不完整,我想从事物中随机挑选出两个项目并返回。不过,这不是眼前的问题。

我有一个名为 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>

但是我不断得到的输出是“未定义”的警报(事物['one'])!我不明白第一个警报是如何返回未定义的,它就在事物关联数组的定义之下。

4

1 回答 1

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创建函数之外的关键字。

于 2012-07-13T16:33:53.867 回答