【问题标题】:dojo declare class variable undefineddojo 声明类变量未定义
【发布时间】:2013-03-24 01:49:10
【问题描述】:

我正在学习将 dojo 用于我即将开展的项目,因此提前承认这可能是一个非常基本的问题。我试图找到答案,但没有成功。此外,我必须使用稍旧版本的 dojo - 我认为没有 AMD 的 1.6。

我已经使用 dojo.declare 定义了一个类,这里​​是一个稍作修改的示例:

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

因此,本质上,一个名为 CustomClass 的类具有一个名为 firstProperty 的公共属性,该属性的默认值为“默认值”,一个当前不执行任何操作的构造函数和一个名为 Test 的公共方法,调用时会发出警报firstProperty 的值。

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

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

在此先感谢阅读本文的人! 西蒙

【问题讨论】:

    标签: javascript class dojo


    【解决方案1】:

    您缺少的关键概念是范围的概念。当您执行alert(firstProperty); 时,您指的是局部变量firstProperty。其中,在您的情况下,您尚未定义任何具有该名称的局部变量。但是,您已经使用该名称定义了一个 instance 变量。与 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 来演示代码。

    【讨论】:

    • 您好,非常感谢您的快速回答。在我意识到我在示例中犯的错字之前,您已经回答了,我现在已经对其进行了修改。在我的实际代码中,我在警报函数中使用了“this”。我相信你是完全正确的,我的错误在于理解范围,但仍然无法弄清楚我哪里出错了。
    • 非常感谢您的帮助 - 它正在工作!您在编辑中提到了我不是从 dijit._Widget 继承的事实。我应该是(就 _Widget 提供的最佳实践或有用性而言?)。再次感谢。
    • _Widget(以及它的父类_WidgetBase)有一堆有用的方法和钩子来控制小部件的生命周期(除了简单的构造函数)。它还添加了一些不错的辅助方法,例如自动 getter/setter 支持和连接到事件/方法调用。查看dojotoolkit.org/reference-guide/1.8/dijit/…dojotoolkit.org/documentation/tutorials/1.6/… 了解更多信息,
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2015-01-14
    • 2020-04-12
    • 2021-12-11
    • 2011-04-30
    相关资源
    最近更新 更多