RequireJS:“归还这个;”而不是全球化的

时间:2014-02-07 06:07:18

标签: javascript module namespaces dependencies requirejs

我有一个模块的代码:

define(
    [
        "jquery",
    ],
    function
    (
        $
    )
    {
        this.someArray = []
        this.someObject = 
            function(
                        someID
                        somePrivacyType
                    )
                {
                    this.someID         = someID;
                    this.somePrivacyType = somePrivacyType;

                    someArray[this.someID]  = this;
                };

        return this;
    }
);

我想从另一个模块使用它的命名空间访问上面的模块,但使用return this;会抛出全局命名空间中的所有内容。
如此:

define(
    [
        "jquery",
        "myProject/SomeModule"
    ],
    function
    (
        $,
        SomeModule
    )
    {
        console.log(SomeModule); //Returns window
    //someArray is in the global namespace rather than only
        console.log(someArray); //Returns someArray (Want it to return undefined)
    //on the SomeModule namespace below
        console.log(SomeModule.someArray); //Returns someArray (Want only this to return Array)
        console.log(SomeModule.someObject);

        return this;
    }
);

我想继续使用某种类型的return this;,而不必在模块本身内声明命名空间。通过这种方式,我可以很容易地通过在模块中声明私有变量来保留私有变量,而不是this。我知道我可以简单地从模块中声明命名空间,但这会消除模块性。

有没有办法从RequireJS中提取文件的命名空间或以其他方式返回this作为一个对象,该对象只能被调用它的名称空间引用?

1 个答案:

答案 0 :(得分:1)

我建议如下:

define(["jquery"], function ($) {
    var ns = {}; // Create our namespace.
    ns.someArray = [];
    ns.someObject = function(someID, somePrivacyType) {
        this.someID = someID;
        this.somePrivacyType = somePrivacyType;

        ns.someArray[this.someID]  = this;
    };

    return ns;
});

我假设ns.someObject是用new调用的。我还假设您在分配给someArray的函数中对ns.someObject的访问权限是为了访问您的命名空间中的someArray,因此ns.someArray

根据命名空间的性质,您可能希望使用Object.create(null)来创建它,而不是{}。当你拥有一组有限的密钥并且注意不要覆盖{}上定义的方法时,Object是可以的。如果没有,最好使用Object.create(null)来避免冲突。