通过重新分配使对象 属性 不可更改但在 JavaScript 中可修改
Making an object property unchangeable through reassignment but modifiable in JavaScript
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;
}
我有这个 class,它定义了玩家角色的样子。我想通过重新分配使 experienceObtained
和 gold
属性不可更改,但可以通过运算符修改,以避免用户使用控制台将自己的值设置为这些属性。
this.gold = {
amount: 0,
get gold(){
return this.amount;
}
};
如上所示,我尝试使用 getter 而不声明 setter,但我仍然可以通过控制台分配 amount
任何值。
我不知道我是否误解了 JavaScript 中 getter 和 setter 的用法,或者是否不可能。
to avoid users set their own values to these properties using console.
最简单的方法就是防止从顶层访问 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);
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;
}
我有这个 class,它定义了玩家角色的样子。我想通过重新分配使 experienceObtained
和 gold
属性不可更改,但可以通过运算符修改,以避免用户使用控制台将自己的值设置为这些属性。
this.gold = {
amount: 0,
get gold(){
return this.amount;
}
};
如上所示,我尝试使用 getter 而不声明 setter,但我仍然可以通过控制台分配 amount
任何值。
我不知道我是否误解了 JavaScript 中 getter 和 setter 的用法,或者是否不可能。
to avoid users set their own values to these properties using console.
最简单的方法就是防止从顶层访问 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);