【问题标题】:How to save and load objects with methods?如何使用方法保存和加载对象?
【发布时间】:2018-07-22 16:09:00
【问题描述】:

有问题。我像这样创建我的游戏对象:

var game_status = {
    money          : 350000000,
    reset_status   : function() {
        this.money         = 350000000;
    }
}
function saveGame(){
    localStorage.setItem('game_status', JSON.stringify(game_status));
}
function loadGame(){
    game_status     = JSON.parse(localStorage.getItem('game_status'));
}

加载游戏状态后,“reset_status”方法不存在了。

也许我应该描述对象,创建实例,保存实例,然后使用加载中的参数重新加载创建实例?

【问题讨论】:

    标签: javascript json object javascript-objects


    【解决方案1】:

    只需将存储的状态分配给对象即可:

    Object.assign(game_status, JSON.parse(localStorage.getItem('game_status')));
    

    这样你就不必编写构造函数了。

    【讨论】:

    • 但是 game_status 是一个有效的 json 吗?
    • @nullPointer 是的,函数在序列化时被删除,这是想要的行为
    • MDN 显示它不受 IE 支持。是否有任何解决方法或其他解决方案?
    【解决方案2】:

    由于无论如何对象状态和对象行为都在一个简单的哈希中,并且假设这里需要的是一个快速补丁,我会这样做:

    var INITIAL_GAME = {
        money          : 350000000
    },
    game_status; 
    
    function saveGame(){
        // strip behavior
        delete game_status.resetGame;
        localStorage.setItem('game_status', JSON.stringify(game_status));
    
    }
    function loadGame(){
        game_status = JSON.parse(localStorage.getItem('game_status'));
        if (!game_status) {
        // init by cloning initial object
            game_status = JSON.parse(JSON.stringify(INITIAL_GAME));
        }
        // set behavior again
        game_status.resetGame = function resetGame() {
           this.money = 350000000;
        }
     }
    
     loadGame();
    

    【讨论】:

    • 感谢您的回答。不过有通知。 JSON.stringify() 将删除对象中的任何方法,因此无需删除对象的方法。
    【解决方案3】:

    for (var attrname in game_statusTemp) { game_status[attrname] = game_statusTemp[属性名]; }

    我的情况的快速解决方法。在发现 How to duplicate object properties in another object?How can I merge properties of two JavaScript objects dynamically?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多