【问题标题】:Storing JS objects along with prototypes, instance types etc将 JS 对象与原型、实例类型等一起存储
【发布时间】:2015-04-15 16:28:20
【问题描述】:

是否可以从本质上归档 JS 对象的状态,超出如果您要从中生成 JSON 字符串将被序列化的内容?

考虑在游戏中保存状态,并在单独的场合将其加载回window

【问题讨论】:

  • 您有什么状态不会包含在对象的 JSON 字符串中?您需要知道进行任何(反)序列化的类型,然后原型将被继承。
  • 您的状态是什么,如果您需要存储对象“构造函数”来保存它?我认为应该避免这种魔法。状态为普通对象 + 自定义存储/恢复功能似乎是更好的方法。它已针对 Web 应用程序进行了很好的测试(例如,请参阅 facebook's flux)。

标签: javascript json object save archive


【解决方案1】:

最简单的方法是序列化对象,然后从序列化数据中重新创建它:

function AnObject(number, string) {
  this.number = number;
  this.string = string;
  this.add = function(){number++};
}
var initialObject = new AnObject(1, 'a');
var serialized = JSON.stringify(initalObject);
//Gives {"number": 1, "string": "a"}

var parsed = JSON.parse(serialized);
var recreated = new AnObject(parsed.number, parsed.string);
//Is the same as initialObject

如果你愿意,你可以序列化函数:

function serializeFunction(f) {
  var string = f.toString();
  return string.substring(string.indexOf('{')+1, string.length - 1);
}
var func = function(){alert(1)};

【讨论】:

    【解决方案2】:

    json字符串不能包含函数、构造函数……我认为你需要做的是定义一个类,你可以在其中找到你需要的所有方法,然后你可以从你得到的json数据中实例化你的对象.这是一个简单的例子:

    function Stats (options) {
    
         this.a = options.a;
         this.b = options.b;
         this.toString = function () { return this.a + ' ' + this.b; };
         this.toJSON = function () { return { a : this.a , b : this.b }; };
         // Methods
    
         return this;
    }
    

    在这种情况下,每当您获取 json 数据时,您只需要实例化您的对象

    var stats = new Stats (JSON);
    console.log(stats.toString());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2015-12-16
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多