JSON如何不能保存对象的function?

在我的游戏中,我通过将所有对象转换为JSON并将其保存到文件来保存当前状态。 一些对象,像敌人一样,有它们的function,但JSON不能保存function! 有替代scheme吗?

 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方法是.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);

我认为你必须保存你的对象的types,这样的function可以重新添加在parsing时间。 例如在构造函数中为你的敌人放置一个type属性。 在parsing的时候,首先像正常的JSON一样parsingstring,然后深层遍历结果对象。 当你遇到一些Enemy ,重新附上方法等等。