我得到了下一个代码,其中一些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);
谢谢
答案 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.stringify
和JSON.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();