优雅的 JavaScript 之 编写优雅的 Settings 类

2018-06-04 20:09:03 +08:00
 banxi1988

原文链接

1842 次点击
所在节点    前端开发
4 条回复
mfhh
2018-06-13 16:55:01 +08:00
有点啰嗦啊。
我宁愿写成
const storage={};

function loadSettings(){
let strSettings=storage["settings"]||"{}";
return JSON.parse(strSettings)
}
function saveSettings(settings){
storage["settings"]=JSON.stringify(settings)
}

var settings=loadSettings();
settings.username = "banxi";
settings.age=10;
settings.autoLogin=true;
saveSettings(settings);
banxi1988
2018-06-14 12:01:26 +08:00
@mfhh 不过你这样的话,失去了类型安全和自动补全了。
mfhh
2018-06-15 10:16:59 +08:00
@banxi1988
你不是用了 Typescript 么?写个 var settings:ISettings; 就有类型安全和自动补全了。

上文是参照你的风格写的代码。我实际代码一般直接写成这样:

//类型定义,在编辑器中有类型安全和自动补全
interface ISettings {
autoLogin: boolean;
username: string;
age: number;
}

//数据尽量使用 plain json
const settings:ISettings ={
autoLogin:true,
username: "banxi"
age: 10
}

//持久化操作单独拿出,以便性能优化
storage["settings"]=JSON.stringify(settings)
banxi1988
2018-06-15 13:58:22 +08:00
@mfhh 嗯通过 ISettings 是可以做到这一点,我项目把所有接口的返回都增加了对应 Interface 声明。我也是我很喜欢 TS 的一个方面。
不过用在这个配置上还是不太理想呢。 比如上面你是把整个 settings 一同取出和存入。
当这个 settings 中的某些值比较大的时,会造成不心要的存取开销。
而我的的这种设计是不会影响其他键值的存取的。

另外相比定义一个 `Interface` ,我的这种做法只是增加了一个 `@asSettings` 的声明。 所以我这种做法,我感觉还是有可取之处的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX