说我有一个这样的对象实例:Object.defineProperty得到集中返回错误值
var objectA = {"a": 1, "b": 2, "c" : 3};
,并在我的代码访问属性是这样的:
cc.log(objectA.a); // output 1
现在我要添加一个get/set为这个对象提供一些简单的加密/解密功能:
hookSetGet: function (someObject) {
for (var key in someObject) {
cc.log("key: " + key);
// store the origin value before Object.defineProperty
var pureValue = someObject[key];
// add a property to store the encrypted value
var hiddenValueKey = "__" + key;
someObject[hiddenValueKey] = undefined;
Object.defineProperty (
someObject,
key,
{
set: function (val) {
// simulate encrypt
this.hiddenValueKey = val + 1;
cc.log("hooked set: " + val + " - " + this.hiddenValueKey);
},
get: function() {
cc.log("hooked get: " + this.hiddenValueKey + " - " + (this.hiddenValueKey - 1));
// simulate decrypt
return this.hiddenValueKey - 1;
}
}
);
// trigger set to encrypt
someObject[key] = pureValue;
}
}
但是当我测试这样的函数时:
var objectA = {"a": 1, "b": 2, "c" : 3};
this.hookSetGet(objectA);
cc.log(objectA.a);
cc.log(objectA.b);
cc.log(objectA.c);
我没有得到的结果,我想:
key: a
hooked set: 1 - 2
key: b
hooked set: 2 - 3
key: c
hooked set: 3 - 4
hooked get: 4 - 3
3
hooked get: 4 - 3
3
hooked get: 4 - 3
3
看起来甚至当我打电话
objectA.a
我会得到的
objectA.c
值这个问题似乎很简单,但我不能无花果排除哪里出错。
任何建议将赞赏,感谢:)
UPDATE:
我试着下面的代码,而无需改变hookSetGet的代码:
cc.log(objectA.__a);
cc.log(objectA.__b);
cc.log(objectA.__c);
,并得到:
undefined
undefined
undefined
然后我改变了hookSetGet函数:
set: function (val) {
// simulate encrypt
someObject[hiddenValueKey] = val + 1;
cc.log("hooked set: " + val + " - " + someObject[hiddenValueKey]);
},
get: function() {
cc.log("hooked get: " + someObject[hiddenValueKey] + " - " + (someObject[hiddenValueKey] - 1));
// simulate decrypt
return someObject[hiddenValueKey] - 1;
}
我将所有this.hiddenValueKey都改为someObject [hiddenValueKey]。
,输出是:
cc.log(objectA.__a); // 2 good
cc.log(objectA.__b); // 3 good
cc.log(objectA.__c); // 4 good
cc.log(objectA.a); // hooked get: 4 - 3 still wrong
cc.log(objectA.b); // hooked get: 4 - 3 still wrong
cc.log(objectA.c); // hooked get: 4 - 3 still wrong
是否明智,而你是列举了它来修改一个对象? –
@MatthewHerbst:是的,这应该不重要,属性永远不会迭代两次。 – Bergi
[点符号与括号表示法]的可能重复(https://stackoverflow.com/questions/4968406/javascript-property-access-dot-notation-vs-brackets)和[JavaScript闭环内循环](http:// stackoverflow.com/q/750486/1048572) – Bergi