2011-10-31 49 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的東西時,重新附上方法等等。