我写了一个javascript库,用于存储和控制棋盘游戏的状态。
我希望不允许库的使用者修改游戏状态的安全性,所以我使用闭包来定义他们应该用来以良好约束的方式修改状态的函数。我还在内部变量上使用_.cloneDeep
并公开了这个克隆版本。
const game = () => {
const gameState = {};
const setSomeState = val => {
gameState.field = val;
};
return {
gameState: () => _.cloneDeep(gameState),
setSomeState: setSomeState,
};
}
module.exports = game;
问题在于,如果游戏状态发生变化,他们必须通过重新调用game.gameState()
明确要求更新,而不是使用_.cloneDeep
而不是使用Create Procedure LookUpCustomer
(@CustomerLastName varchar(30) = null)
as
select CustomerLastName
from Customer
where @CustomerLastName like ('_[A-Z]_')
我返回实际的内部引用变量然后对象的字段的任何更改都将随时可用。
是否有可能充分利用两个世界,消费者可以获得一个对象1)自动使其内容与游戏状态保持同步,但2)他们无法修改?
编辑:
我应该补充说,我关心保留身份并避免消费者不得不重新克隆内部状态的原因是,我有一个使用此库的React应用程序,并且重新克隆游戏状态变量会导致它们在技术上不同对象,所以React认为某些组件需要重新渲染,即使对象没有改变它们的内容,也只是它们的身份。