3

我正在学习将 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 的公共方法,当调用该方法时,该方法的值将发出警报第一属性。

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

我还尝试在构造函数中调用 dojo.safeMixin(this, null) ,因为我读到的内容让我想知道这是否是必需的,但这并没有什么不同。

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

4

1 回答 1

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. 我更新了上面的代码示例。我还创建了一个简单的 jsfiddle 来演示代码。

于 2013-04-02T16:49:00.927 回答