1

以这段代码为例:

(function(foo) {

    foo.init = function() {};

    // other public/private methods here.

    return foo;

}(window.FOO = window.FOO || {}));

我这样称呼它:

FOO.init();

是否可以允许用户定义是什么FOO

换句话说,我需要允许多个实例window.FOO; 例如,喜欢window.BILLYwindow.BAZ(或者,应该是window.billy.FOOwindow.baz.FOO?)。

换句话说,是否有一种优雅的方式(允许用户)使用上述构造和初始化的变体来命名“命名空间”?

4

3 回答 3

2

和是windows.billy.FOO首选windows.baz.FOO

阅读Addy Osmani 的 Essential JS Namespacing Patterns以加快速度(最相关的部分:Deep object extension)。

干杯!

于 2013-01-30T20:39:53.600 回答
2

如果我对您的理解正确,您想更改上面的代码,使其名称FOO是动态的。你可以这样做,使用 [] 属性访问器:

function initFoo(fooName) {
    (function(foo) {

        foo.init = function() {};

        // other public/private methods here.

        return foo;

    }(window[fooName] = window[fooName] || {}));
}

initFoo('FOO');
initFoo('BILLY');

但我不确定这会有什么意义,你的例子很抽象。

于 2013-01-30T20:43:21.267 回答
1

您可能想查看 RequireJS:http ://requirejs.org/docs/start.html

它可能具有您正在寻找的最终用户功能。

于 2013-01-30T20:38:18.373 回答