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
,重新附上方法等等。