微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – dojo声明类变量undefined

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

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

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)作为我读过的东西让我怀疑这是否是必需的,但它并没有什么区别.

无论如何,提前感谢读取此内容
西蒙

解决方法:

您缺少的关键概念是范围的概念.当你做警报(firstProperty);,你指的是局部变量fi​​rstProperty.在您的情况下,您没有使用该名称定义任何局部变量.但是,您已经定义了具有该名称的实例变量.与java等语言不同,必须使用此方法显式访问实例变量.

所以你的榜样应该是:

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演示代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐