【问题标题】:Javascript keeping namespaces in scope of object's functionsJavascript 将命名空间保持在对象函数的范围内
【发布时间】:2012-01-28 21:17:01
【问题描述】:

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

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

FooBar.Foo = function() {

}

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

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

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

FooBar.Foo = function() {

}

using("FooBar");

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

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

unusing("FooBar");

所以,是的,这样的事情是否可能,或者我是否经常将这些内容纳入范围?

【问题讨论】:

    标签: javascript namespaces closures


    【解决方案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());
    });
    

    【讨论】:

    • 这对我正在做的事情来说是很多开销,并且没有完成我需要的事情。给定当前的系统,可以完全一样地实现。
    • 这部分取决于您是否希望任何其他 JS 程序员能够理解您的代码。模块系统是标准的,而您提出的建议会引起大多数人的注意,想知道您脑子里在想什么(像这样搞乱全局范围是疯狂的!),并立即产生重构以消除疯狂的强烈冲动。
    • 我看到的与命名空间有关的大部分内容是创建对象来保存引用。除此之外,我也不喜欢将事物带入全局范围并一直退出,这就是为什么我正在寻找更好的选择。我认为“与”的事情可能没问题,但这也有一个缺点......无论哪种方式,这都是我试图找到一种方法来解决我不想一直输入完整命名空间的懒惰......
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 2013-10-25
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多