Делать свойство объекта неизменным через переназначение, но изменяемое в JavaScript

Правильный способ заключается в использовании списков, как уже отмечали другие люди, но если вы хотите сделать это без использования списков по любой причине, вы можете сделать это:

cartProd :: [a] -> [b] -> [(a,b)]
cartProd xs [] = []
cartProd [] ys = []
cartProd (x:xs) ys = map (\y -> (x,y)) ys ++ cartProd xs ys
1
задан Zlorak 29 March 2019 в 00:39
поделиться

1 ответ

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

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

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

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

0
ответ дан CertainPerformance 29 March 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: