Dojo子类有不同的要求

时间:2014-06-27 13:15:56

标签: javascript dojo subclass

如果我有一个类似下面的类,是否可以创建一个具有相同功能的子类但是会覆盖其中一个“要求”?

我正在尝试在下面的示例中使用我自己的/ registry版本。感谢

define([
    "dojo/_base/declare",
    "dojo/query",
    "../registry",
], function(declare, query, registry){

    return declare("dijit.form._SearchMixin" {

    // Original Base code

2 个答案:

答案 0 :(得分:1)

我不认为这是可能的。子类并不是真正继承自应该是" dynamic"的模块,但它只取决于它。

如果您想更改依赖模块,可以将其封装在模块内的字段中,例如:

define([
    "dojo/_base/declare",
    "dojo/query",
    "../registry"
], function(declare, query, registry) {

    return declare("dijit.form._SearchMixin", {
        registry: registry,

        aFunction: function() {
            this.registry.doStuff();
        }
    });
});

现在您可以创建它的子类并覆盖registry属性。只需确保所有交互都通过registry属性引用的模块。

在很多情况下,Dojo会这样做,它在下拉菜单中使用,拖放,......。

答案 1 :(得分:1)

如果你的意思是这样的话:

你有一些使用modulA

的课程
define(["modulA"], function(modul){
  return declare("classA", [], {
    doSomething: function() {
      modul.doSomething()
    }
  })
});

然后你在classA的基础上声明另一个类,它应该使用modulB:

define(["classA", "modulB"], function(classA, modulB) {
  // do something magical so that doSomething will use modulB
  return declare("classB", [classA]) {}
})

如果不覆盖使用modulA的所有函数,则无法实现。如果它是您的代码,您可以使用动态绑定模块以支持此类多态的方式编写它:

define([], function(){
  return declare("classA", [], {
    // dynamic binding, it can be overwritten
    modulName: "modulA",
    doSomething: function() {
        require([this.modulName, function(modul) {
                 // you must take into account, you're in async code now
          modul.doSomething()
        }  
    }
  })
});