Böyle bir nesne örneği var ki bir olsun/bazı basit şifrelemek sağlamak için bu nesne için ayarlanmış/özelliğini şifresini:set olsun Object.defineProperty dönüş yanlış değer
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;
}
}
ama böyle fonksiyonu test ederken:
var objectA = {"a": 1, "b": 2, "c" : 3};
this.hookSetGet(objectA);
cc.log(objectA.a);
cc.log(objectA.b);
cc.log(objectA.c);
ben sonuç alamadım istediğim:
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
Ben
objectA.a
çağrı bile gibi görünüyor ben
objectA.c
değerini alacak Sorun oldukça basit görünüyor ama ben sadece inc olamaz neyin yanlış olduğunu araştır.
Herhangi bir öneri takdir edilecektir, teşekkürler :)
GÜNCELLEME:
Ben değişiklik olmaksızın hookSetGet kodunu aşağıdaki kodu çalıştı:cc.log(objectA.__a);
cc.log(objectA.__b);
cc.log(objectA.__c);
ve almak:
undefined
undefined
undefined
Daha sonra hookSetGet işlevini değiştirdim:
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;
}
Tüm this.hiddenValueKey 'i SomeObject [hiddenValueKey] olarak değiştirdim.
ve çıktısı:
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
bu akıllıca mı bunun üstesinden numaralandırılırken ise bir nesneyi değiştirmek için? –
@MatthewHerbst: Evet, bu önemli olmamalı, özellikler iki kez yinelenmez. – Bergi
[nokta notasyonu vs parantez notasyonu] 'nın olası kopyası (https://stackoverflow.com/questions/4968406/javascript-property-access-dot-notation-vs-brackets) ve [JavaScript döngüleri iç içe geçirme] (http: // stackoverflow.com/q/750486/1048572) – Bergi