使用dojo.require()而不使用dojo.declare()

时间:2011-03-15 13:26:54

标签: dojo dependencies

我对Dojo的文档很困惑。如何在不实际使用dojo.declare()的情况下使用dojo.require()?我不想使用dojo.declare()的原因是它将声明的类公开为全局变量。

现在我的代码看起来像这样:

HTML file:
dojo.require('module.test');

Module/test.js:
dojo.provide('module.test');
function test() {
    return 'found me';
}

我无法让Dojo在任何地方返回test()方法。在没有声明的情况下使用dojo.require()的正确模式是什么?

3 个答案:

答案 0 :(得分:6)

我认为您将dojo.provide / dojo.requiredojo.declare混为一谈。它们是完全不同的概念。

与模块相关的事情

dojo.provide定义模块

dojo.require要求在稍后运行任何代码之前定义模块

与JavaScript类相关的事情

dojo.declare完全不同。它声明了一个Dojo风格的类。

您可以在一个模块中拥有多个类,或者组成一个类的多个模块。一般来说,模块!==类,它们是完全不相关的概念。

答案 1 :(得分:2)

dojo.provide定义代码模块,以便加载器可以看到它,并通过该名称从全局命名空间创建一个对象。从那时起,您可以将代码直接锚定到该全局变量,例如

模块/ test.js:

dojo.provide('module.test');

module.test.myFunc = function() {
    return 'found me';
}

您可以使用各种模式,例如创建闭包和隐藏“私有”函数实现,通过您在dojo.provide中创建的全局引用公开它们:

dojo.provide('module.test');

function(){
    // closure to keep top-level definitions out of the global scope
    var myString = 'found me';

    function privateHelper() {
        return myString;
    }

    module.test.myFunc = function() {
        return privateHelper();
    }
}();

请注意,上面简单地将方法直接放在对象上。现在,还有dojo.declare,它经常与dojo.provide一起使用来创建一个带有原型和mixin的对象,这样你就可以创建带有一些继承的'new'关键字的实例,甚至可以模拟多个继承vai mixins。这种OO抽象经常被过度使用。它确实接近Java等语言所需的模式,因此有些人习惯于为所有事物声明对象。

请注意,从Dojo 1.5开始,dojo.declare返回一个对象,并不一定需要在全局范围内声明任何内容。

答案 2 :(得分:1)

这是我有时使用的模式(这将是test.js的内容):

(function() {

var thisModule = dojo.provide("module.test");

dojo.mixin(thisModule, {
    test: function() {
        return "found me";
    }
});

})();

现在,您可以在HTML页面中引用module.test.test()