dojo声明类变量undefined

时间:2013-04-02 16:45:49

标签: javascript class dojo

我正在学习将dojo用于我即将进行的项目,所以提前承认这可能是一个非常基本的问题。我试图找到答案,但没有成功。另外,我不得不使用稍微旧版本的dojo - 1.6我认为没有AMD。

我使用dojo.declare对一个类进行了描述,这是一个稍微修改过的示例:

dojo.declare("myNamespace.CustomClass", null, {
    firstProperty: "The default value",
    constructor: function () { }
    Test: function () {
        alert(this.firstProperty);
    }
});

所以,实际上,一个名为CustomClass的类,其名为firstProperty的公共属性具有默认值“默认值”,当前不执行任何操作的构造函数以及调用时称为Test的公共方法将提醒firstProperty的值。

我的假设是当我创建一个CustomClass实例并调用Test()时,我会得到一个带有“默认值”的警告框。但是,我没有,我得到一个带有“undefined”的警告框。如果我在创建实例后设置firstProperty的值,然后调用Test,它就可以工作,我得到了属性设置的任何内容。因此,一种方法是在构造函数中设置默认值,但我读过的内容表明它应该按我假设的方式工作,所以我宁愿正确地执行它。

我也尝试在构造函数中调用dojo.safeMixin(this,null),因为我读到的东西让我怀疑这是否是必需的,但它并没有什么区别。

提前感谢,无论如何都要读到这个! 西蒙

1 个答案:

答案 0 :(得分:5)

您缺少的关键概念是范围的概念。当您执行alert(firstProperty);时,您指的是本地变量firstProperty。在您的情况下,您没有使用该名称定义任何局部变量。但是,您已使用该名称定义了实例变量。与java等语言不同,必须使用this显式访问实例变量。

所以你的例子应该是:

dojo.declare("myNamespace.CustomClass", null, {
firstProperty: "The default value",
constructor:function(params){
    console.log(params);
    dojo.safeMixin(this,params);
},
Test: function () {
    alert(this.firstProperty);
}

});

var myInstance = new myNamespace.CustomClass({firstProperty:'something else'});
myInstance.Test();

您可能还想查看Javascript Scope Tricks,因为javascript中的范围可能非常棘手。

编辑:我意识到你不是从dijit._Widget继承的。在这种情况下,您需要使用dojo.safeMixin手动将构造函数参数应用于实例。我更新了上面的代码示例。我还创建了一个simple jsfiddle来演示代码。