通过重新分配使对象属性不变,但可以在JavaScript中对其进行修改

Zlorak
class Hero extends Character {
constructor (name, race, gender, role, level){
    super(name, race, gender, role, level);
    this.inventory = [];
    this.experience = {
        experienceNeeded: 100,
        experienceObtained: 0
    };
    this.gold = 0;
}

我有一个此类,定义了玩家角色的状态。我想使experienceObtainedgold属性都可以通过重新分配来更改,但可以通过操作员进行修改,以避免用户使用控制台为这些属性设置自己的值。

this.gold = {
        amount: 0,
        get gold(){
            return this.amount;
        }
    };

如上所示,我尝试使用未声明setter的getter,但仍可以amount通过控制台分配任何值。

我不知道我是否误解了JavaScript中使用getter和setter的方法,或者是否无法做到这一点。

一定的表现

为了避免用户使用控制台为这些属性设置自己的值。

最简单的方法就是防止从顶层访问Hero实例-例如,将所有内容包装在IIFE中:

(() => {
  const hero = new Hero();
  // do stuff with hero
})();

然后,您在IIFE内所做的一切都将名义上是私有的-用户将无法进入控制台并参考和更改他们想要的内容。(不过,由于它他们的浏览器,所以他们可以用其他方式做到这一点,例如使用用户脚本-您不能相信在客户端计算机上运行的任何内容都可以合法完成。)

使用类似的方法,依靠闭包的名义上的私密性,您可以使amount闭包变量的getter不带setter,从而确保它amount不能从外部更改(当然,除非源代码被更改,在这种情况下)无论如何都不能下注):

const Hero = (() => {
  const privateHeroGold = new WeakMap();
  return class Hero {
    constructor() {
      privateHeroGold.set(this, 0);
    }
    get gold() {
      return privateHeroGold.get(this);
    }
    set gold(g) {
      console.log("You're not allowed to do that!");
    }
  }
})();
const hero = new Hero();
console.log(hero.gold);
hero.gold = 5;
console.log(hero.gold);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

函数中的变量是对它们的对象的强引用,还是可以在函数主体的运行时中对其进行重新分配?

重新分配javascript对象

为什么传递给函数的对象可以被突变但不能在javascript中重新分配?

JavaScript:通过另一个引用变量访问时无法通过重新分配清除数组

javascript中无法理解的对象重新分配

循环中的对象属性重新分配

通过重新分配方法参数的变量,将值重新分配给方法内部的实例变量

通过解构重新分配 JavaScript 变量

javascript对象数组-重新分配

无法获取javascript函数中的HTML元素,但可以获取该元素的属性

通过创建新对象与重新分配属性来重置Angular输入

无法从站点管理员存储CQ-Dialog页面属性,但可以通过sidekick进行操作

通过重新分配内存EXC_BAD_ACCESS错误

我可以通过重启按钮来更改井字游戏中的innerHTML,但是一旦重启,我将无法重新分配以开始游戏

在if / else中重新分配变量(JavaScript)

重新分配JavaScript中的函数声明

JavaScript中的功能重新分配

PHP:有没有一种方法可以设置一个类,以便您可以在不重新分配其值的情况下修改该类的属性?

Javascript-如何在不重新分配对象属性的情况下更改它们

在Java对象的Kotlin中设置属性时出现奇怪的“无法重新分配Val”错误

如何基于“等级”对象属性重新分配列表(在打字稿中)?

无法在 javascript 中更改高度但可以更改宽度

单个属性更新与对象以角度重新分配

遍历对象属性并对其进行修改

Cordova无法从CLI进行构建,但可以通过XCode xcworkspace进行构建

无法通过SSH从远程计算机进行连接,但可以在本地进行连接

无法通过单选按钮获取数据属性值,但可以通过选择选项获取

Javascript重新分配let变量并进行解构

在Julia中的对象数组中重新分配值