Javascript将命名空间保留在对象函数的范围内

时间:2011-12-28 02:12:24

标签: javascript namespaces closures

我想知道是否有办法将命名空间保留在Javascript对象的函数范围内。

首先,让我们设置一些东西。假设我们在命名空间FooBar中有一个类(好吧,与Javascript一样接近类)Foo。然后在全局命名空间(窗口)中,我们有类Bar,它实例化了Foo,所以......

FooBar.Foo = function() {

}

function Bar() {
  this.init();
}

Bar.prototype = {
  init: function() {
    this.foo = new FooBar.Foo();
  }
}

目前我有两个系统可以将事物纳入范围: 1.使用(“FooBar”)和unusing(“FooBar”)这些函数将对给定命名空间内容的引用移入和移出全局命名空间 2. with(namespace(“FooBar”)){}这使用normal with behavior,为它提供一个对象,其中包含对命名空间中包含的所有内容的引用。 所以现在,我必须在每个函数中使用这些方法之一来将命名空间放入范围。我试图看看是否有一种方法在声明类时定义它们,并且由于某种类型的闭包而使它们仍然在这个类的范围内......

FooBar.Foo = function() {

}

using("FooBar");

function Bar() {
  this.init();
}

Bar.prototype = {
  init: function() {
    this.foo = new Foo();
  } 
}

unusing("FooBar");

所以,是的,甚至可能是这样的事情,还是我经常把它们放到范围内?

1 个答案:

答案 0 :(得分:1)

这有点可怕。我建议使用现代模块系统,如RequireJS。 My friend put together a nice presentation on the evolution and use of module systems in JavaScript。它们是JS对名称空间的回答。

您的代码看起来像这样:

// FooBar.js
define(function (require, exports, module) {
    exports.Foo = function () { };
});

// Bar.js
define(function (require, exports, module) {
    // This is kind of like "using FooBar" in other languages.
    var Foo = require("FooBar").Foo;

    exports.Bar = function () {
        this.init();
    };
    exports.Bar.prototype = {
        init: function () {
            this.foo = new Foo();
        }
    };
});

// elsewhere.js
define(function (require, exports, module) {
    var Foo = require("FooBar").Foo;
    var Bar = require("Bar").Bar;

    console.log(new Foo());
    console.log(new Bar());
});