2011-10-31 14 views
5

W mojej grze zapisuję bieżący stan, konwertując wszystkie obiekty do JSON, a następnie zapisując je w pliku. Niektóre obiekty, takie jak wrogowie, mają na nich funkcje, ale JSON nie może zapisywać funkcji! Czy istnieje alternatywa lub rozwiązanie?Dlaczego JSON nie może zapisać funkcji obiektu?

+4

Ponieważ json deserializuje _data_. – Raynos

+0

Czy są specyficzne instancje funkcji lub "klasa"? – Thor84no

+0

Co by się stało z zakresem funkcji, gdyby była serializowana i deserializowana? Funkcja to coś więcej niż jej kod jako reprezentacja ciągów znaków. – pimvdb

Odpowiedz

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

sposób .toJSON to standardowy interfejs JSON.stringify będzie wyglądać ten sposób i wywołać, jeśli istnieje, to stringify zwrócony obiektu.

Metoda .fromJSON jest tylko nazwanym konstruktorem dla obiektu Wroga.

przykład betonuJSfiddle

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

Meta-opcja:

Opcja meta byłoby napisać nazwę klasy do obiektu

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

Następnie podczas ładowania wszystkie twoje dane json właśnie robisz

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

+0

W zasadzie muszę tworzyć nowe instancje wrogów za każdym razem, gdy zaczyna się gra? No cóż, trochę więcej pracy, ale bez znaczenia ... – corazza

+0

@bane nowe instancje są tanie.Możesz to meta-ify, jeśli chcesz.Teraz – Raynos

+0

@Raynos To nie zadziała, jeśli wrogowie są głęboko w drzewie obiektów, prawda? – thejh

1

myślę, że trzeba zapisać na typ obiektu tak, że funkcje mogą być ponownie dodawane w czasie przetwarzania. Na przykład. włóż właściwość type na wroga w konstruktorze. W czasie analizowania najpierw przeanalizuj ciąg znaków jak normalny JSON, a następnie głęboko przemierzaj wynikowy obiekt. Kiedy napotkasz coś, co było Enemy, ponownie załóż metody.

Powiązane problemy