Javascript RequireJS:“;归还这个&引用;而且它不是全球性的

Javascript RequireJS:“;归还这个&引用;而且它不是全球性的,javascript,module,namespaces,dependencies,requirejs,Javascript,Module,Namespaces,Dependencies,Requirejs,我有一个模块的代码: define( [ "jquery", ], function ( $ ) { this.someArray = [] this.someObject = function( someID somePrivacyType

我有一个模块的代码:

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

                    someArray[this.someID]  = 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;
    }
);
我想继续使用某种类型的
返回这个而不必从模块本身中声明名称空间。通过这种方式,我可以很容易地通过在模块中声明私有变量来保留它们,但不能在
This
上声明它们。我知道我可以简单地从模块内声明名称空间,但这会剥夺模块性。


是否有任何方法可以从RequireJS中提取文件的名称空间,或者以其他方式返回
作为一个对象,该对象将仅由调用它的名称空间引用?

我建议如下:

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
调用的。我还假设您在分配给
ns.someObject
的函数中访问
someArray
是为了访问命名空间上的
someArray
,因此
ns.someArray


根据命名空间的性质,您可能希望使用
Object.create(null)
来创建它,而不是
{}
<代码>{}
如果您有一组有限的键,并且注意不要覆盖在
对象上定义的方法,则可以。如果没有,最好使用
Object.create(null)
来避免冲突。

Awesome非常有效,所有假设都是正确的。。。我想如果我做了类似namespace.object的事情,我就必须做someModule.namespace.object,或者显式地将someModule命名为名称空间。结果证明那不是真的:D。。。谢谢