通过重新分配使对象属性不可更改,但在JavaScript中可修改

通过重新分配使对象属性不可更改,但在JavaScript中可修改,javascript,properties,getter-setter,unmodifiable,Javascript,Properties,Getter Setter,Unmodifiable,我有一个定义玩家角色的类。我想通过重新分配使experienceobtened和gold属性不可更改,但可以通过操作符进行修改,以避免用户使用console为这些属性设置自己的值 class Hero extends Character { constructor (name, race, gender, role, level){ super(name, race, gender, role, level); this.inventory = []; this.expe

我有一个定义玩家角色的类。我想通过重新分配使
experienceobtened
gold
属性不可更改,但可以通过操作符进行修改,以避免用户使用console为这些属性设置自己的值

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;
}
如上所示,我尝试使用getter而不声明setter,但仍然可以通过控制台分配
amount
任何值

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;
}
我不知道我是否误解了JavaScript中getter和setter的使用,或者这是不可能的

为了避免用户使用console为这些属性设置自己的值

要做到这一点,最简单的方法就是防止从顶层访问英雄实例-例如,将所有内容包装在IIFE中:

this.gold = {
        amount: 0,
        get gold(){
            return this.amount;
        }
    };
然后,你在iLife中所做的一切名义上都是私有的——用户将无法进入控制台引用和更改他们想要的内容。(尽管如此,因为它是他们的浏览器,他们可以用其他方式来做,比如用用户脚本——你不能相信在客户端机器上运行的任何东西都是合法的。)

使用类似的方法,依靠闭包的名义隐私,您可以使
amount
成为闭包变量的getter,而不使用setter,从而确保
amount
不能从外部更改(当然,除非源代码被更改,在这种情况下,所有赌注都被取消):

const-Hero=(()=>{
const privatherogold=new WeakMap();
返程英雄{
构造函数(){
privateHeroGold.set(本,0);
}
获得金牌{
归还私人黄金。得到(这个);
}
定金(克){
log(“你不允许这样做!”);
}
}
})();
康斯特英雄=新英雄();
控制台。日志(英雄。黄金);
英雄金=5;
控制台。日志(英雄。黄金)
为了避免用户使用console为这些属性设置自己的值

要做到这一点,最简单的方法就是防止从顶层访问英雄实例-例如,将所有内容包装在IIFE中:

this.gold = {
        amount: 0,
        get gold(){
            return this.amount;
        }
    };
然后,你在iLife中所做的一切名义上都是私有的——用户将无法进入控制台引用和更改他们想要的内容。(尽管如此,因为它是他们的浏览器,他们可以用其他方式来做,比如用用户脚本——你不能相信在客户端机器上运行的任何东西都是合法的。)

使用类似的方法,依靠闭包的名义隐私,您可以使
amount
成为闭包变量的getter,而不使用setter,从而确保
amount
不能从外部更改(当然,除非源代码被更改,在这种情况下,所有赌注都被取消):

const-Hero=(()=>{
const privatherogold=new WeakMap();
返程英雄{
构造函数(){
privateHeroGold.set(本,0);
}
获得金牌{
归还私人黄金。得到(这个);
}
定金(克){
log(“你不允许这样做!”);
}
}
})();
康斯特英雄=新英雄();
控制台。日志(英雄。黄金);
英雄金=5;

控制台。日志(英雄。黄金)要防止客户端修改数据,您可以做的事情不多。浏览器最终是属于用户的。要防止客户端对数据的修改,您可以做的不多。浏览器最终属于用户。如果我稍后使用函数来修改和添加值,比如使用
hero.gold+=1
,那么通过操作符不可以修改
hero.gold
?您可以将所有更改值的逻辑放在闭包中,通过使用WeakMap。如果我稍后使用函数来修改和添加值,比如使用
hero.gold+=1
,那么通过操作符将
hero.gold
不可修改吗?您可以使用WeakMap将所有更改值的逻辑放在闭包中。