0

この単純化された例に似たカスタム オブジェクトを作成しました。私の実装では、Playlist により複雑なメソッドが提供されます。

function Playlist(id) {
    var _songs = [];

    if(!id)
        id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });

    var playlist = {
        id: id,
        title: "New Playlist",

        clear: function(){
            _songs = [];
            _save();
        },

        songCount: function () {
            return _songs.length;
        },

        getSongs: function () {
            return _songs;
        }
    }

    return playlist;
}

これで、Playlist オブジェクトを保存する別のオブジェクト Playlists ができました。

function playlists(){
    var _playlists = null;
    var _currentPlaylist = null;

    var _save = function () {
        localStorage.setItem('playlists', JSON.stringify(_playlists));
    };

    var _loadPlaylists = function(){
        _playlists = localStorage.getItem('playlists');

        try {
            if (_playlists && _playlists != 'undefined')
                _playlists = JSON.parse(_playlists);
        }
        catch(exception){
            console.error(exception);
        }

        if(!_playlists){
            _playlists = new Array();
            var defaultPlaylist = new Playlist(null, null);

            _playlists.push(defaultPlaylist);
            _save();
        }
    };

    var playlists = {
        count: function(){
            return _playlists.length;
        },

        getPlaylists: function(){
            return _playlists;
        },

        getCurrentPlaylist: function(){
            currentPlaylist = _currentPlaylist;

            if(!currentPlaylist){
                _loadPlaylists();
                currentPlaylist = _playlists[0];
                currentPlaylist.selected = true;
            }

            return currentPlaylist;
        },

        addPlaylist: function(playlistName){
            var playlist = new Playlist(null, playlistName);
            _playlists.push(playlist);
            _save();
        }
    }

    return playlists;
}

JSON.parse を使用してプレイリスト オブジェクトを JSON からオブジェクトに変換すると、プレイリスト オブジェクトのメソッドが取り除かれていることに気付きました。これは、JSON.stringify がオブジェクトを JSON に変換する方法がわからない (または変換すべきかどうかわからない) ためだと思います。

これに対する適切な応答は何ですか?メソッドをシリアル化可能としてタグ付けすることは可能ですか? それとももっと作業が必要ですか?

4

2 に答える 2

2

JSON.stringify()メソッドではなく、データプロパティを保存します。それがどのように機能するかです。

実際のJavaScriptコードを保存することを期待している場合、それは単に設計された方法ではありません。必要に応じて、オブジェクトのカスタムタイプであるデータプロパティを追加し、オブジェクトを読み戻すときに、それを使用して適切なメソッドを再アタッチできます。JSON.stringify()しかし、それはとでは起こりませんJSON.parse()

読んでいるオブジェクトのタイプが事前にわかっている場合は、そのタイプのオブジェクトを作成し、保存されたJSONを初期化子として渡すことができます。

于 2012-07-16T16:26:52.017 に答える
1

前述のように、stringify関数ではなく、プロパティをシリアル化するように設計されています。このブログ投稿を見つけました。このブログ投稿では、なぜそうなのかを説明するプロセスと、最後に__proto__プロパティを使用してオブジェクトの機能を保持する方法を説明しています。今のところそれを回避する唯一の方法のように見えます。

于 2012-07-16T16:32:54.173 に答える