我的任务
在我的 JavaScript 代码中,我经常使用对象将键“映射”到值,以便以后可以通过某个值直接访问它们。例如:
var helloMap = {};
helloMap.de = "Hallo";
helloMap["en"] = "Hello";
helloMap.es = "Hola";
因此,我使用两种可用的符号对象样式和数组样式在我的源代码中逐步构建地图对象。
稍后我可以访问我添加的值helloMap["de"]
,例如。如果我不必关心在对象上设置属性的顺序,那一切都很好。
如果我现在想迭代对象属性,据我所知,没有办法确保我会按照它们被添加的顺序迭代它们。
注意:我不能使用一些包装对象,而只是在其中保存一个数组,然后使用它的方法添加值,如下所示:
var HelloMap = function(){
this.myMap = [];
this.addProperty = function(key, value){
this.myMap.push({key: key, value: value});
}
}
或类似的东西对我不起作用。所以解决方案需要对使用对象的程序员绝对透明。
也就是说,我需要的对象将是一个空对象,它维护添加到它的属性的顺序。这样的事情会做:
var helloMap = {};
helloMap = getOrderAwareObject(helloMap);
以便表格的每一次进一步分配,helloMap.xy = "foo"
都helloMap["yz"] = "bar"
将在对象中“按顺序”进行跟踪,
可能的解决方案
由于我没有在下划线或 jQuery 中找到任何解决方案给我这样一个特殊的对象,我遇到了为 JavaScript 对象中的属性定义 getter 和 setter 的可能性,Object.defineProperty
因为我可以依赖ECMAScript 5标准,我可以使用它。
这个问题是,在实际设置之前,您必须知道可以在对象上设置的所有可能属性。因为如果你定义它,你必须命名它。
如果没有为属性定义 getter 和 setter,我正在搜索的是类似于Default Getter和Default Setter的东西。所以我可以将排序后的地图隐藏在对象接口后面。
- 在您知道的任何框架中是否已经有解决方案?
- 有没有像“默认getter/setter”这样的机制?