我的工作是大量使用JavaScript的应用程序。 我试图包括一些面向对象的做法。 在这种尝试中,我创建了一个基本的类像这样的:
function Item() { this.init(); }
Item.prototype = {
init: function () {
this.data = {
id: 0,
name: "",
description: ""
}
},
save: function() {
alert("Saving...");
$.ajax({
url: getUrl(),
type: "POST",
data: JSON.stringify(this.data),
contentType: "application/json"
});
}
}
我在我的应用程序创建项目实例,然后将它们保存到像这样的本地存储:
Item item = new Item();
window.localStorage.setItem("itemKey", JSON.stringify(item));
在另一页,或在其他时间,我retriving从像这样的本地存储该项目:
var item = window.localStorage.getItem("itemKey");
item = JSON.parse(item);
item.save();
不幸的是,“保存”功能似乎并没有得到达。 在控制台窗口中,有一个错误,指出:
* save_Click(匿名函数)的onclick *
我有一种预感,在“(匿名函数)”是说的控制台窗口的方式“呼吁item.save(),但项目是一个匿名类型,所以我试图访问一个匿名函数”。 我的问题是,我不知道如何“VAR项目”再次转换成项目类的实例。 是否有人可以告诉我?
简短的回答:
功能无法序列化成JSON。
说明:
JSON是基于JS文字语法的一个子集跨平台的序列化方案。 既然如此,它只能存储某些事情。 每http://www.json.org/ :
- 物体:一个对象是一个无序集合的名称/值对。 对象开始于{(左括号),结尾}(右括号)。 每个名称后跟:(结肠)和名称/值对是由,(逗号)隔开。
- 数组:数组是值的有序集合。 的阵列开始于[(左括号)和结尾(右括号)。 值由,(逗号)隔开。
- 值:值可以是在双引号的字符串或数字,或真或假或为空,或物体或阵列。 这些结构可以嵌套。
功能不能序列化为JSON,因为另一个非JS平台,将无法反序列化,并使用它。 考虑在反向的例子。 说我在我的服务器,包含属性和方法PHP对象。 如果我系列化PHP的那个对象json_encode()
和方法被列入输出,如何将我的JavaScript以往任何时候都能够解析和理解的方法PHP代码,更不用说使用这些方法呢?
你们看到的在你生成的JSON是toString()
你正在使用的平台功能的价值。 serilizer调用JSON toString()
上的任何正在连载这是不恰当的JSON。
我相信,您的解决方案是停止存储JSON /本地存储的实例。 相反,保存相关数据为您重新设置一个新的实例,当你需要一个实例。
我知道这个问题已经回答了,但是我在这个偶然的事故,想分享一个解决这个问题,如果有人有兴趣。
而不是这样做:
var item = window.localStorage.getItem("itemKey");
item = JSON.parse(item);
item.save();
做这样的事情:
// get serialized JSON
var itemData = window.localStorage.getItem("itemKey");
//instantiate new Item object
var item = new Item();
// extend item with data
$.extend(item, JSON.parse(itemData));
// this should now work
item.save();
只要这将作为你想调用的函数(即,保存())为原型,而不是一个实例方法(通常倍的情况下,并且确实在OP的原来的问题的情况下。
在$.extend
方法是jQuery的的实用方法,但它是微不足道的推出自己的。
你不能做到这一点,怎么也可以javascript可能知道项目有保存功能? JSON犯规允许用作DATAS。 刚看完JSON规范,你不能保存功能。
你需要做的是建立在你想股票的哈希序列化和反序列化方法。 将specifiy什么导出并解析相应的JSON字符串后,如何可以“唤醒”的对象。
只能存储在DOMstorages平原对象(饼干,urlparams ...,需要[德]通过系列化的一切JSON.stringify
/ JSON.parse
)。 所以,你发送的AJAX数据时做了什么
ajaxsend(this.data);
也适用于字符串序列化。 您只能存储数据,而不是实例属性(如原型,构造等)。 因此,使用
savestring(JSON.stringify(item.data));
这是可能的,因为item.data
是这样一个普通的对象。 和恢复时,你将只能得到明文数据对象返回。 你的情况很容易重建Item
从纯数据实例,因为你的项目在公共区域提供物业持有它们的值(仅):
var item = new Item;
item.data = JSON.parse(getjsonstring());
放弃
没有一个全职的时间JS开发者,答案可能有一些小错误:
龙镗解释
正如@JAAulde提到的,你不能将对象序列化为JSON,因为具有的功能,您使用的是不允许这样做的技术。
很多人忘记或忽略了在应用程序中使用的对象作为保存/从存储恢复,可能不完全一样。
短期和快速解答
既然你已经封装的对象的数据成员到一个单一的领域,你可能会想尝试这样的事:
// create J.S. object from prototype
Item item = new Item();
// assign values as you app. logic requires
item.data.name = "John Doe";
item.data.description = "Cool developer, office ladies, love him";
// encoded item into a JSON style string, not stored yet
var encodedItem = JSON.stringify(item.data)
// store string as a JSON string
window.localStorage.setItem("itemKey", encodedItem);
// do several stuff
// recover item from storage as JSON encoded string
var encodedItem = window.localStorage.getItem("itemKey");
// transform into J.S. object
item.data = JSON.parse(encodedItem);
// do other stuff
干杯。