ste*_*_ut 5 javascript memory optimization performance
我正在使用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");
Run Code Online (Sandbox Code Playgroud)
现在实施2:
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;
Run Code Online (Sandbox Code Playgroud)
主要区别在于使用"私有"变量与"公共"属性来存储枚举.我认为实现1有点慢,但我不确定将枚举保持为"私有"会减少内存使用量.谁能解释两者(如果有的话)内存占用和性能的差异?任何其他建议/意见表示赞赏.
...但我不确定将枚举保留为“私有”是否会减少内存使用
相反,如果有的话:您仍然必须拥有枚举对象,并且必须有一个函数来访问它。
就速度而言,我不会担心它。添加的函数调用不会产生任何真正的区别(当我担心使用新的等等时,我研究了它,即使在 IE6 上,其 JS 引擎非常慢,这也没关系)。forEach
几年后,您可能能够两全其美:由于 ECMAScript5 的Object.defineProperties功能,只读的枚举:
var Enums = Object.defineProperties({}, {
ActionStatus: {
value: Object.defineProperties({}, {
New: {value: 1},
Open: {value: 2},
Closed: {value: 3}
})
}
});
// Usage
var n = Enums.ActionStatus.New; // 1
Run Code Online (Sandbox Code Playgroud)
默认情况下,使用创建的属性defineProperties是只读的。
事实上,如果您添加 ES5“垫片”以在本机Object.defineProperties尚不具备该功能的浏览器上创建,那么您现在基本上就可以拥有它。“shimmed”版本将创建读写属性,因为只有本机支持的版本才能真正创建只读属性,但您现在可以编写代码并知道它将在现代浏览器上按您喜欢的方式工作(大约一半)目前所有的网络冲浪者都拥有它们),同时仍在使用不太现代的技术,只是鲁棒性较差。
当然,EMCAScript6 可能会更进一步,但这仍然是未来的事情。
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |