字符串化不解析我的setter函数

时间:2013-08-05 04:22:05

标签: javascript json google-chrome-extension getter-setter

我得到了下一个代码,其中一些getter和setter以这种方式完成,所以我可以隐藏参数。

// trackedWebsite: does not use the new to create the object trackedWebsite. 
//Creates an object with private parameters only accessible by the getter 

var trackedWebsite = function(url,extensions){
return {
        //This returns the URL of the website
        get get_URL() {
            return url;
        },

        get get_Extensions(){
            return extensions;
        },

        set set_Extensions(ext){
            this.extensions = ext;
        }


    }

}

在某些时候,我想在localStorage中将信息保存为一个名为网站的跟踪网站数组,所以我用JSON解析它:

localStorage.websites=JSON.stringify(websites);

最后在某些时候我再次加载所有网站:

function getAllWebsites(){
if (localStorage.websites === undefined){
    return new Array();
}
return JSON.parse(localStorage.websites);

}

当我这样做时,get函数正常工作,但我发现我收到的数组中的trackedWebsites不包含setter。当我尝试使用它时,我得到:Uncaught TypeError:Object#没有方法'set_Extensions'。为什么会这样?为什么getter工作正常而不是setter?

编辑: 添加了调用setter的代码

            websites[index].set_Extensions(extensions);

谢谢

1 个答案:

答案 0 :(得分:1)

不仅是你的二传手被打破了,而且还有你的吸气剂。将对象序列化为JSON字符串后,结果类似于

{"get_URL":"http://....","get_Extensions":["extension1","extension2"]}

如果您真的想要重建原始对象,请使用

function getAllWebsites() {
    if (localStorage.websites === undefined){
        return [];
    }
    var parsedJSON = JSON.parse(localStorage.websites);
    // Assume that parsedJSON is an array
    return parsedJSON.map(function(website) {
        return trackedWebsite(website.get_URL, website.get_Extensions);
    });
}

如果您需要更多灵活性,可以定义自定义JSON序列化和解析方法 - 请参阅JSON.stringifyJSON.parse


您的代码存在另一个问题。这不是惯用语,因为您的getter / setter的前缀是set_get_。您的跟踪网站"对象的工作原理如下:

var url = website.get_URL;
website.set_Extensions = ...;
var extensions = website.get_Extensions;

这应该是

var url = website.URL;               // Being at the right side implies getter
website.extensions = ...;            // Assignment implies setter
var extensions = website.extensions; // Being at the right side implies getter

或者至少:

var url = website.get_URL();
website.set_Extensions(...);
var extensions = website.get_Extensions();