V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
banxi1988
V2EX  ›  前端开发

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

  •  
  •   banxi1988 ·
    banxi1988 · 2018-06-04 20:09:03 +08:00 · 1816 次点击
    这是一个创建于 2365 天前的主题,其中的信息可能已经有所发展或是发生改变。
    4 条回复    2018-06-15 13:58:22 +08:00
    mfhh
        1
    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
        2
    banxi1988  
    OP
       2018-06-14 12:01:26 +08:00
    @mfhh 不过你这样的话,失去了类型安全和自动补全了。
    mfhh
        3
    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
        4
    banxi1988  
    OP
       2018-06-15 13:58:22 +08:00
    @mfhh 嗯通过 ISettings 是可以做到这一点,我项目把所有接口的返回都增加了对应 Interface 声明。我也是我很喜欢 TS 的一个方面。
    不过用在这个配置上还是不太理想呢。 比如上面你是把整个 settings 一同取出和存入。
    当这个 settings 中的某些值比较大的时,会造成不心要的存取开销。
    而我的的这种设计是不会影响其他键值的存取的。

    另外相比定义一个 `Interface` ,我的这种做法只是增加了一个 `@asSettings` 的声明。 所以我这种做法,我感觉还是有可取之处的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:08 · PVG 11:08 · LAX 19:08 · JFK 22:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.