gpt4 book ai didi

javascript - 序列化具有方法的自定义对象。序列化后删除的方法 - 采取什么步骤?

转载 作者:行者123 更新时间:2023-11-28 20:59:02 26 4
gpt4 key购买 nike

我创建了一个与此简化示例类似的自定义对象。我的实现为 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;
}

现在,我有另一个对象,Playlists,它保存 Playlist 对象:

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 转换为使用 JSON.parse 的对象时,我注意到播放列表对象已被剥离其方法。我相信这是因为 JSON.stringify 不知道如何(或者它不知道应该)将对象转换为 JSON。

我想知道对此的正确回应是什么?是否可以将方法标记为可序列化?或者还需要做更多的工作吗?

最佳答案

JSON.stringify() 保存数据属性,而不是方法。这就是它的工作原理。

如果您希望它保存实际的 JavaScript 代码,那根本就不是它的设计方式。如果需要,您可以添加一个作为对象的自定义类型的数据属性,当您读回对象时,您可以使用它来重新附加适当的方法。但是,JSON.stringify()JSON.parse() 不会发生这种情况。

如果您事先知道正在读取的对象类型,则可以创建该类型的对象并将保存的 JSON 作为初始值设定项传递给它。

关于javascript - 序列化具有方法的自定义对象。序列化后删除的方法 - 采取什么步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com