【问题标题】:Should I encapsulate JSON data into a Javascript object? [closed]我应该将 JSON 数据封装到 Javascript 对象中吗? [关闭]
【发布时间】:2014-05-26 20:25:36
【问题描述】:

假设您有一个服务器端 Javascript 应用程序,并且您从客户端收到以下数据:

[
    {
        "userId": "0001",
        "Details": [
            {
                "Name": "John",
                "Surname": "Doe",
                "bankAccount": "123"
            }
        ]
    }
]

将这些数据封装到 Javascript 对象中是否是一种好习惯?例如,

    var Person = (function () {
    var bankAccount = "";

    function Person(userId, name, surname, bankAccount) {
        this.userId = userId;
        this.name = name;
        this.surname = surname;

        this.getBankAccount = function() {
            return this.bankAccount;
        };
        this.setBankAccount = function(ba) {
            this.bankAccount = ba;
        };
    }
    return Person;
})();

这样我可以控制涉及用户敏感数据的操作:

   var p = new Person(1, "John", "doe", "123");
   p.name
=> 'John'
   p.bankAccount
   p.getBankAccount()
   p.setBankAccount(123)
   p.getBankAccount()
=> 123

但是,如果我需要将这些数据保存到像 MongoDB 这样的 NoSQL 数据库中,我需要将所有内容序列化回 JSON,这不是很奇怪吗?我想知道您对这种做法有何看法。

【问题讨论】:

    标签: javascript json mongodb


    【解决方案1】:

    在某种接口中封装纯 JavaScript 对象有几个优点,方法是 getset 你的值。

    实际上有很多框架可以帮助您。

    Backbone

    var Person = Backbone.Model.extend();
    var person = new Person({id : 1, name : "Peter"});
    
    person.get("id");
    // -> 1
    
    person.get("name");
    // -> Peter
    

    一个优点是您可以定义自己的 parsing 函数,该函数将从服务器获取 JSON 并根据需要对其进行转换。

    另一个优点是您可以使用事件将自己挂钩到设置过程中。

    person.on("change:name", function() { console.log("changed..."); });
    person.set("name", "Frank");
    // the change callback gets fired.
    

    当您需要持久化数据时,您还可以将对象转换回纯 JavaScript 对象。

    // in Backbone
    person.toJSON();
    // -> {id:1, name:"Peter"}
    

    如果我们谈论的是服务器上的技术,那么您既不需要框架也不需要getter或setter作为函数,因为您可以使用getset语法直接定义它们

    var log = ['test'];
    var obj = {
      get latest () {
        if (log.length == 0) return undefined;
        return log[log.length - 1]
      }
    }
    console.log (obj.latest); // Will return "test".
    
    var latest = obj.latest;
    // works
    
    obj.latest = "something";
    // throws...
    

    【讨论】:

    • 好的,感谢您的反对,您能详细说明为什么我的回答如此错误吗?
    • 我给你的答案投了赞成票,因为我喜欢 Backbone 方法(不那么冗长),但我希望获得更多关于 JSON 数据的反序列化和序列化的 cmets,以便在应用程序的各个层中移动数据在坚持之前。想法?
    • 在我更新我的答案之前,我们说的是客户端还是服务器端?
    • 服务器端。我期待来自 RhinoJS/node.js/avatar.js 程序员的一些 cmets...
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多