为什么JSON无法保存对象的功能?

时间:2011-10-31 15:39:42

标签: javascript json node.js

在我的游戏中,我通过将所有对象转换为JSON然后将其保存到文件来保存当前状态。有些对象,比如敌人,对它们有功能,但JSON无法保存功能!有替代方案或解决方案吗?

2 个答案:

答案 0 :(得分:7)

var Enemy = {
  toJSON: function () {
    // pack it up
  },
  fromJSON: function (json) {
    // unpack it.
  },
  /* methods */
};

var e = Object.create(Enemy);
var json = JSON.stringify(e);
var same_e = Enemy.fromJSON(json);

.toJSON方法是JSON.stringify的标准接口,它将查看此方法并调用它(如果存在),它将对返回的对象进行字符串化。

.fromJSON方法只是您的Enemy对象的命名构造函数。

具体示例 JSfiddle

var Enemy = {
  constructor: function(name, health) {
    this.health = health || 100;
    this.name = name;
  },
  shootThing: function (thing) { },
  move: function (x,y) { },
  hideBehindCover: function () {},
  toJSON: function () { 
    return {
      name: this.name,
      health: this.health
    };
  },
  fromJSON: function (json) {
    var data = JSON.parse(json);
    var e = Object.create(Enemy);
    e.health = data.health;
    e.name = data.name;
    return e;
  }
}

var e = Object.create(Enemy);
e.constructor("bob");
var json = JSON.stringify(e);
var e2 = Enemy.fromJSON(json);
console.log(e.name === e2.name);

<强>元选项:

元选项是将类名写入对象

Game.Enemy = {
  ...
  class: "Enemy"
};

然后当您加载所有json数据时,只需

var instance = Game[json.class].fromJSON(json);

答案 1 :(得分:1)

我认为你必须在对象上保存类型,以便在解析时重新添加这些函数。例如。在构造函数中为您的敌人添加type属性。在解析时,首先像普通JSON一样解析字符串,然后深入遍历生成的对象。当您遇到Enemy的内容时,请重新附加方法。