我想知道是否有办法将命名空间保留在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");
所以,是的,甚至可能是这样的事情,还是我经常把它们放到范围内?
答案 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());
});