Создание свойства объекта неизменяемым путем переназначения, но изменяемого в JavaScript - PullRequest
1 голос
/ 29 марта 2019
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;
        }
    };

Как показано выше, я пытался использовать метод получения, не объявляя его, но я все еще могу назначить amount любое значение через консоль.

Я не знаю, неправильно ли я понимаю использование геттеров и сеттеров в JavaScript или это невозможно сделать.

1 Ответ

0 голосов
/ 29 марта 2019

, чтобы пользователи не устанавливали свои собственные значения для этих свойств с помощью консоли.

Самый простой способ сделать это - просто запретить доступ к экземпляру Hero с верхнего уровня -например, обернуть все в IIFE:

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

Тогда все, что вы делаете внутри IIFE, будет номинально приватным - пользователь не сможет зайти в консоль и сослаться и изменить то, что он хочет,(Тем не менее, поскольку он является их браузером, они могут сделать это другими способами, например, с помощью пользовательского сценария - вы не можете доверять всему, что выполняется на клиентской машине, чтобы это было сделано законно.)

Используя аналогичный метод, полагаясь на номинальную конфиденциальность замыкания, вы можете сделать amount получателем переменной замыкания без установщика, гарантируя, что 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);
...