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

How the object created by dojo.declare can access its own properties?

本文关键字:访问 属性 自己的 何访问 declare dojo 创建 对象      更新时间:2023-09-26

我在使用 Dojo/_base/dedeclare 创建的 Dojo 类类对象时遇到了一些概念问题。

我创建了以下模块:

define(["dojo/_base/declare", ....], function(declare,....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

问题是,该函数newItem不起作用,因为当从按钮单击调用它时,this指向按钮小部件,而不是"my.widget"实例。

我很困惑。如何引用"my.widget"实例?在我读过的 Dojo 类中,当前实例在 this 下可用。

如果要使用正确的作用域调用newItem,可以使用 dojo/_base/langhitch() 函数。

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()函数将确保this引用正确。这听起来像是真正的魔术,但它使用屏幕后面的某种反射来执行该功能。

它真正做的是使用 Function.prototype.apply 函数来启动魔术。正如您在本文中所读到的,它接受上下文和参数。因此,它实际上会在执行newItem时更改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的匿名函数中,this引用传递的第一个参数(可以是任何对象)。