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;
}
我有一个此类,定义了玩家角色的状态。我想使experienceObtained
和gold
属性都可以通过重新分配来更改,但可以通过操作员进行修改,以避免用户使用控制台为这些属性设置自己的值。
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] 删除。
我来说两句