我正在学习将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);,你指的是局部变量firstProperty.在您的情况下,您没有使用该名称定义任何局部变量.但是,您已经定义了具有该名称的实例变量.与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演示代码.
原文地址:https://codeday.me/bug/20190901/1780433.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。