Javascript dojo.declare创建的对象如何访问自己的属性?
在使用Dojo/_base/declare创建的类似于Dojo类的对象时,我在概念上遇到了一些问题 我创建了以下模块:Javascript dojo.declare创建的对象如何访问自己的属性?,javascript,dojo,declare,Javascript,Dojo,Declare,在使用Dojo/_base/declare创建的类似于Dojo类的对象时,我在概念上遇到了一些问题 我创建了以下模块: define([“dojo/_base/declare”,..)函数(declare…){ 返回declare('my.widget',null,函数(…){ 启动:函数(){ .... 新建按钮({onClick:this.newItem},newButtonNode) }, newItem:function(){ this.openDialog({},this.saveIt
define([“dojo/_base/declare”,..)函数(declare…){
返回declare('my.widget',null,函数(…){
启动:函数(){
....
新建按钮({onClick:this.newItem},newButtonNode)
},
newItem:function(){
this.openDialog({},this.saveItemCallback)
},
openDialog:函数(项,回调){…},
saveItemCallback:函数(项){….}
})
})
问题是,函数newItem
没有运行,因为当从按钮单击调用它时,这个指向按钮小部件,而不是“my.widget”实例
我很困惑。如何引用“my.widget”实例?在我读过的Dojo类中,当前实例在this
下可用 您可以使用dojo.hitch
将上下文附加到函数:
define(["dojo/_base/declare", ....], function(declare,....){
var myFunc = dojo.hitch(this, function() {
this.openDialog({}, this.saveItemCallback)
});
return declare('my.widget', null ,function(..){
startup: function() {
....
new Button({onClick: this.newItem}, newButtonNode)
},
newItem: myFunc,
openDialog: function(item,callback){...},
saveItemCallback: function(item){....}
})
})
通过这样做,您可以有效地声明,在传递给dojo.hitch
的匿名函数中,此
引用了传递的第一个参数(可以是任何对象)。如果您想使用正确的范围调用newItem
,您可以使用dojo/\u base/lang
,hitch()
功能
define(["dojo/_base/declare", "dojo/_base/lang", ....], function(declare, lang, ....){
return declare('my.widget', null ,function(..){
startup: function() {
new Button({onClick: lang.hitch(this, "newItem"}, newButtonNode)
},
newItem: function() {
this.openDialog({}, this.saveItemCallback)
},
openDialog: function(item,callback){...},
saveItemCallback: function(item){....}
})
});
hitch()
功能将确保此
参考正确。这听起来像是真正的魔法,但它使用屏幕后面的某种反射来执行函数
define(["dojo/_base/declare", "dojo/_base/lang", ....], function(declare, lang, ....){
return declare('my.widget', null ,function(..){
startup: function() {
new Button({onClick: lang.hitch(this, "newItem"}, newButtonNode)
},
newItem: function() {
this.openDialog({}, this.saveItemCallback)
},
openDialog: function(item,callback){...},
saveItemCallback: function(item){....}
})
});
它真正做的是使用函数.prototype.apply
函数来启动魔术。正如您在中所看到的,它接受一个上下文和参数。因此,当执行newItem
时,它实际上会更改此
引用。可以,但这不是问题所在。问题是,对于newItem函数,“this”是按钮,而不是“myInstance”“myInstance”仅在“startup”函数中可见。@ŁukaszL。修好了。它与Chris Hayes发布的内容几乎相同,但采用了新的AMD语法。是的,就是这样!我仍然无法理解“hitch”在做什么。我编辑了我的答案来解释“hitch”的作用。在屏幕后面,它使用某种反射来做一些神奇的事情。有一个名为apply
的函数,它允许你修改这个
所指的内容。但是,知道要搜索什么,我在Dojo代码中发现了lang.hitch的多个用法,所以你的答案是Dojo中做事情的标准方式。这样做,我甚至在创建对象之前就出现了错误,在myFunc声明中,openDialog
函数的“this.openDialog是未定义的”,请记住,有时将调用作为参数比将回调作为参数更为简洁。