javascript - RequireJS: "return this;"并且不是全局的

标签 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;无需从模块本身内部声明命名空间。这种方式让我很容易通过在模块中声明私有(private)变量来保留私有(private)变量,但不是在 this 上。 .我知道我可以简单地从模块内声明命名空间,但这会脱离模块化。
有什么方法可以从 RequireJS 中提取文件的命名空间或以其他方式返回 this作为一个对象,它只会被调用它的命名空间引用?

最佳答案

我建议如下:

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)以免发生冲突。

关于javascript - RequireJS: "return this;"并且不是全局的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21620507/

相关文章:

ruby-on-rails - 如何干掉使用 'Module'的资源路由

reactjs - 在 Gatsby/React 中将文件作为字符串(或源 Assets )导入

c++ - 通用 lambda 不能在命名空间中使用?

php - browscap ini 指令未设置

javascript - Javascript 中的字符串 <-> 数字转换

perl - 如何获取已安装 Perl 模块的版本和位置?

python-3.x - 从同级目录导入 - Python 3.7

c# - 如何在 WCF 服务中将方法组织/构建到命名空间中?

javascript - 使用 Vue CLI - 如何更新、删除和查看所有可用插件

javascript - 访问对象中的对象变量