我想为我的对象设置一个自定义的getter和setter方法,它包装Map
。
不知何故,当我使用数组作为键getter
时,它们具有相同的值时表现相同。即使它们是两个不同的参考。 (在FF和Chrome中测试过)。
var Cons = function (){
this.data = new Map();
};
Cons.prototype.initialiseGetterAndSetter = function initialiseGetterAndSetter(prop){
Object.defineProperty(this, prop, {
get: function(){
return this.data.get(prop);
},
set: function(val){
this.data.set(prop, val);
}
});
};
var obj = new Cons();
var arr1 = [1];
var arr2 = [1];
var arr3 = [2];
obj.initialiseGetterAndSetter(arr1);
obj[arr1] = 1;
document.getElementById('box1').innerText = obj[arr1]; // 1 as expected
document.getElementById('box2').innerText = obj[arr2]; // expected undefined but got 1
document.getElementById('box3').innerText = obj[arr3]; // undefined as expected
正如你所看到的,如果你把它传递给吸气剂并不重要,那就和我期待的相同。它只检查它是否具有相同的值,这对我来说很奇怪。你能解释一下为什么它会这样吗?
提前致谢!
修改 当您直接访问地图时,它会返回预期的结果。
答案 0 :(得分:2)
JavaScript对象上的属性名称是字符串,当您使用字符串以外的名称作为名称时,它首先被转换为字符串。
arr1
和arr2
都是内容为[1]
的数组,当您toString()
时,您获得"1"
。
arr3
中的数组同样会为您提供"2"
。因此arr1
和arr2
映射到同一属性,名称为"1"
,而arr3
则为另一个属性。
答案 1 :(得分:1)
对象属性名称只能是字符串值。当您致电Object.defineProperty()
时,它会将您的prop
值强制转换为字符串(在这种情况下,arr1
和arr2
都会被强制转换为相同的值。
当您尝试使用obj[arr1]
和obj[arr2]
访问对象属性时会发生同样的情况。
如果您希望对象公开地图,请为其提供访问该地图的成员。对象属性不会像您尝试使用它们那样工作:
var Cons = function (){
this.data = new Map();
this.get = function (key) { return this.data.get(key); };
this.set = function (key, value) { this.data.set(key, value); };
};
// further down...
obj.set(arr1, 1);