Правильный способ заключается в использовании списков, как уже отмечали другие люди, но если вы хотите сделать это без использования списков по любой причине, вы можете сделать это:
cartProd :: [a] -> [b] -> [(a,b)]
cartProd xs [] = []
cartProd [] ys = []
cartProd (x:xs) ys = map (\y -> (x,y)) ys ++ cartProd xs ys
, чтобы пользователи не устанавливали свои собственные значения для этих свойств с помощью консоли.
blockquote>Самый простой способ сделать это - просто запретить доступ к экземпляру 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);