Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript dojo.declare创建的对象如何访问自己的属性?_Javascript_Dojo_Declare - Fatal编程技术网

Javascript dojo.declare创建的对象如何访问自己的属性?

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

在使用Dojo/_base/declare创建的类似于Dojo类的对象时,我在概念上遇到了一些问题

我创建了以下模块:

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是未定义的”,请记住,有时将调用作为参数比将回调作为参数更为简洁。