gpt4 book ai didi

javascript - 将 Object.defineProperty getter 还原为原始状态,即普通常量属性

转载 作者:行者123 更新时间:2023-11-30 16:32:01 25 4
gpt4 key购买 nike

我正在尝试以某种方式实现状态效果,以便很少或没有 if游戏程序中的情况,即效果应该应用到对象上。

我创建了一个简单的测试用例,这是我计划的基本框架:

// This can represent a game object - player or monster
var test = {damage: 20};
// For the sake of simplicity, I just define
// EffectMissfortune without inheriting other classes
function EffectMissfortune() {

}
/**
* Applies effect on an object, altering it's properties
* until remove is called **/
EffectMissfortune.prototype.apply = function(obj) {
// Remember oridinal damage
obj._damage = obj.damage;
// Define property getter
Object.defineProperty(obj, "damage", {
// Has about 40% chance to return 50% damage
get: function() {
if(Math.random()<0.4) {
return this._damage/2;
}
else
return this._damage;
},
// This should allow me to overwrite this, right?
configurable: true
});
}
/**
* Removes anything that was set aby `apply` method**/
EffectMissfortune.prototype.remove = function(obj) {
obj.damage = obj._damage;
}

我只是在 Firebug 控制台中写的,我省略了很多东西,比如记住应用的状态效果等等。重要的是我的.remove方法无效:

// Test:
console.log("No effect: ");
console.log(test.damage, test.damage, test.damage, test.damage, test.damage, test.damage, test.damage, test.damage);
// Apply effect
var effect = new EffectMissfortune();
effect.apply(test);
console.log("Missfortune: ");
console.log(test.damage, test.damage, test.damage, test.damage, test.damage, test.damage, test.damage, test.damage);
effect.remove(test);
// Effect removed?
console.log("No effect: ");
console.log(test.damage, test.damage, test.damage, test.damage, test.damage, test.damage, test.damage, test.damage);

并输出:

No effect: 20 20 20 20 20 20 20 20Missfortune: 20 10 10 10 10 10 20 10No effect: 10 10 20 20 10 20 20 20

所以第一个简单的问题是:

  • 如何删除上次设置的任何内容 Object.defineProperty打电话?

第二难的是:

  • 如果我要一次应用多个效果,我想链接它们定义的任何东西。在那种情况下,我可以检索当前的 Object.defineSettings 吗? (获取、设置、可配置、可枚举和属性实际值)在调用我自己的 Object.defineProperty 之前?类似于 Object.getPropertySettings

最佳答案

如果您希望能够通过简单的赋值覆盖属性值,则必须将 writable 属性设置为 true (= ). configurable 属性将允许通过对 Object.defineProperty() 的后续调用来更改属性,但不能通过赋值来更改。

编辑但是,一个属性不能既可写 有访问器方法。在这种情况下,您可以使用另一个 .defineProperty() 调用删除该值:

EffectMissfortune.prototype.remove = function(obj) {
Object.defineProperty(obj, "damage", {
configurable: true,
writable: true,
value: obj._damage
});
}

关于您的第二个问题,您可以使用 Object.keys() 获取属性列表,然后为每个属性使用 Object.getOwnPropertyDescriptor()

关于javascript - 将 Object.defineProperty getter 还原为原始状态,即普通常量属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com