0

我得到了下一个代码,其中一些 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 中称为网站的 trackedWebsite 数组中,因此我使用 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 # has no method 'set_Extensions' 。为什么会这样?为什么 getter 能正常工作,而 setter 不能?

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

            websites[index].set_Extensions(extensions);

谢谢

4

1 回答 1

1

不仅你的 setter 坏了,你的 getter 也坏了。将对象序列化为 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.


您的代码还有另一个问题。set_这不是惯用的,因为您的 getter/setter 以and为前缀get_。目前,您的“trackedWebsite”对象的工作方式如下:

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();
于 2013-08-05T09:08:10.400 回答