JavaScript中的命名空间技术,是否推荐?性能如何?需要注意哪些问题?

4
在我正在进行的一个项目中,我将我的代码结构化如下:
MyLib = {
    AField:0,

    ASubNamespace:{
        AnotherField:"value",

        AClass:function(param) {
            this.classField = param;

            this.classFunction = function(){
                // stuff
            }
        }
    },

    AnotherClass:function(param) {
        this.classField = param;

        this.classFunction = function(){
            // stuff
        }
    }
}

以此类推,做像这样的事情:

var anInstance = new MyLib.ASubNamespace.AClass("A parameter.");

这是实现命名空间的正确方法吗?是否存在性能损失,如果有,损失有多严重?当我嵌套深度增加时,性能下降是否会叠加?在使用此结构时,我还应该注意哪些其他问题?

我非常关心每一个性能细节,因为这是一个用于实时图形的库,所以我非常认真地处理任何开销。


1
《Essential JS Design Patterns Book》(http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailnamespacing)包含一个关于命名空间模式的章节。 - hellectronic
3个回答

5

我建议对JavaScript进行命名空间设置是编写可维护代码的关键部分,特别是如果您与开发团队一起工作。

如果您在生产过程中压缩/最小化代码,那么与命名空间相关的性能问题应该很小。

这里是一个SO讨论,讨论了使用命名空间的替代方法。


4
当您将代码构建为一个大型的对象属性层次结构时,有时会遇到这样的问题:MyNamespaceObj.prop1 对于 MyNamespaceObj.prop2 不可用。此外,您在整个代码中经常需要输入完全限定名称。
我开始喜欢做这样的事情:
MyNamespaceObj = (function () {

    // lots of code/definitions that have local scope
    var internallyDefinedItem1 = function (n) { /* ... */ }
    var internallyDefinedItem2 = {
        foo: internallyDefinedItem1(532),
        bar: totallyPrivateNeverExportedFunction(17)
    }
    var totallyPrivateNeverExportedVar = 'blahblahblah';
    function totallyPrivateNeverExportedFunction (x) {
       /* ... */
    }

    return {
        exportedItem1: internallyDefinedItem1,
        exportedItem2: internallyDefinedItem2,
        ...
    }
})();

1
在工作中,我发现最初产生这个问题的工程需要有些东西完全是私有的,这可能会对调试产生不利影响,因为在运行时访问这些值很麻烦。 - Bjartr
这是足够正确的。我主要通过编写在调试时将值记录到控制台的函数(并将它们剥离)来解决它,但确实很烦人的是,在某些调试器中很难对具有有限本地范围的表达式设置监视。我认为这主要是工具弱点而不是技术弱点,希望随着时间的推移能够得到解决。 - Weston C

2

在JavaScript中进行命名空间的设置是非常关键的,以避免潜在的冲突和覆盖。特别是当你的JS代码将要运行在外部环境中,可能会存在其他外部JS代码时,这一点尤为重要。

话虽如此,由于命名空间的设置,性能方面也会受到一定的影响,因为解释器现在必须要跟踪更长的链路才能访问所需的函数/属性。

例如,像下面这样的代码:

  var myProperty;

与以下内容相比,它的访问速度稍快:

 myNameSpace.module1.myProperty;

我认为速度的差别并不大,除非你进行了极深的命名空间嵌套,避免潜在冲突的优势是命名空间的一大优点。

但是,牢记这个问题始终是有益的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接