Javascript模块模式内存占用和性能

Javascript模块模式内存占用和性能,javascript,performance,optimization,memory,Javascript,Performance,Optimization,Memory,我正在使用Javascript模块模式尝试实现类似C#枚举的功能。我目前正在考虑两种方法来实现此功能,但我不了解其中一种方法与另一种方法相比的所有优点 以下是实现1: var MyApp = (function (app) { // Private Variable var enums = { ActionStatus: { New: 1, Open: 2, Closed: 3

我正在使用Javascript模块模式尝试实现类似C#枚举的功能。我目前正在考虑两种方法来实现此功能,但我不了解其中一种方法与另一种方法相比的所有优点

以下是实现1:

var MyApp = (function (app) {

    // Private Variable
    var enums = {
        ActionStatus: {
            New: 1,
            Open: 2,
            Closed: 3
        }
    };

    // Public Method
    app.getEnum = function (path) {
        var value = enums;            
        var properties = path.split('.');
        for (var i = 0, len = properties.length; i < len; ++i) {
            value = value[properties[i]];
        }
        return value;
    };

    return app;

})(MyApp || {});

// Example usage
var status = MyApp.getEnum("ActionStatus.Open");
主要区别在于使用“private”变量和“public”属性来存储枚举。我认为实现1会稍微慢一点,但我不确定将枚举保持为“私有”是否会减少内存使用。有人能解释一下这两种方法在内存占用和性能方面的差异吗(如果有的话)?如有任何其他建议,我们将不胜感激

…但我不确定将枚举保持为“私有”是否会减少内存使用

相反,如果有的话:您仍然必须拥有enums对象,并且必须有一个函数才能访问它

就速度而言,我不担心。添加的函数调用不会带来任何真正的区别(我担心使用新的
forEach
等等,甚至在速度非常慢的JS引擎的IE6上,这都无关紧要)

几年后,您可能会拥有两个世界中最好的:只读枚举,这要归功于ECMAScript 5的功能:

默认情况下,使用
defineProperties
创建的属性是只读的

事实上,如果您添加一个ES5“垫片”来创建
Object.defineProperties
,那么现在基本上就可以拥有它了。“填隙”版本将创建读写属性,因为只有本机支持的版本才能真正创建只读属性,但您现在可以编写代码,并且知道它将在现代浏览器(目前大约一半的网络冲浪者都有)上按您的喜好工作,同时仍然工作,只是健壮性较差,不太现代的


当然,EMCAScript6可能会更进一步,但这仍然是未来的事情。

感谢您抽出时间回答问题并提供ES5信息。在浏览器内存管理方面,您知道实现1如何存储其私有变量,而实现2如何存储其公共属性吗?我试图分析内存消耗,但我所能发现的是,实现2使MyApp的对象大小变大,而实现1没有。但是我知道实现1必须将对私有变量的引用存储在某个地方。@steve_ut:它存储在一个名为(deep Breathe)的东西中,这个变量绑定对象是您用来创建对象的匿名函数调用的执行上下文的变量绑定对象。这就是术语。对函数的每次调用都会得到一个变量绑定对象,该对象包含函数的参数、函数的局部变量以及其他一些属性。这里使用较旧的术语进行描述。@steve_ut:或者更准确地说,它存储在通用内存池中,变量绑定对象有一个对它的引用。这也是查看
MyApp
对象更正确的方法;无论您使用什么工具来映射
MyApp
的大小,都会为您提供一些简化的信息。JavaScript是关于内存池中相互引用的对象的。来自实现2的
MyApp
对象实际上并不包含
app.Enums
引用的对象,实现1也不包含该对象。
var MyApp = (function (app) {

    // Public Property
    app.Enums = {
        ActionStatus: {
            New: 1,
            Open: 2,
            Closed: 3
        }
    };

    return app;

})(MyApp || {});

// Example usage
var status = MyApp.Enums.ActionStatus.Open;
var Enums = Object.defineProperties({}, {
    ActionStatus: {
        value: Object.defineProperties({}, {
            New:    {value: 1},
            Open:   {value: 2},
            Closed: {value: 3}
        })
    }
});

// Usage
var n = Enums.ActionStatus.New; // 1