2011-10-31 71 views
5

在我的游戏中,我通过将所有对象转换为JSON并将其保存到文件来保存当前状态。一些对象,如敌人,有功能,但JSON无法保存功能!有替代方案还是解决方案?JSON如何不能保存对象的功能?

+4

因为json反序列化_data_。 – Raynos

+0

您的函数实例是特定的还是“类”特定的? – Thor84no

+0

当序列化和反序列化时,函数的作用域会发生什么?函数不仅仅是作为字符串表示的代码。 – pimvdb

回答

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);

+0

所以基本上每次游戏开始时我都必须制造新的敌人实例吗?哦,多一点工作,但无论如何... – corazza

+0

@bane新实例很便宜,如果你愿意的话,你可以meta-ify – Raynos

+0

@Raynos如果对象树中的敌人很深,这是行不通的吧? – thejh

1

我认为你必须保存对象的类型,这样的功能可以在解析时重新添加。例如。在你的敌人的构造函数中放置一个type属性。在解析时,首先像正常的JSON一样解析字符串,然后深层遍历结果对象。当你遇到Enemy的东西时,重新附上方法等等。