如果您需要读取或克隆模型的所有数据属性,请使用它 toJSON()方法。此方法返回属性的副本作为 对象(尽管名称不是JSON字符串)。 (当JSON.stringify()是 使用toJSON()方法传递一个对象,它将返回字符串化 toJSON()的值而不是原始对象。中的例子 上一节在他们打电话时利用了这个功能 JSON.stringify()用于记录模型实例。)
http://addyosmani.github.io/backbone-fundamentals/#backbone-basics
任何人都可以告诉我representing an object
符号JSON
的这两种方式之间的区别。我很困惑这些是否达到相同或存在差异。
答案 0 :(得分:51)
来自fine manual:
toJSON行为
如果要进行字符串化的对象具有名为
toJSON
的属性,其值为函数,则toJSON
方法会自定义JSON字符串化行为:而不是要序列化的对象,{{返回的值} 1}}调用时的方法将被序列化。
这就是Backbone使用toJSON
方法进行序列化并给出名为toJSON
的模型实例的原因,您可以这样说:
m
并获取var string = JSON.stringify(m);
以外的属性,而不是服务器不关心的一堆噪音。
也就是说,主要区别在于m
生成一个值(数字,布尔值,对象,......)转换为JSON字符串,而toJSON
总是生成一个字符串。 / p>
default Backbone toJSON
就是这个(对于模型):
JSON.stringify
因此return _.clone(this.attributes);
会为您提供模型属性的浅副本。如果有数组或对象作为属性值,那么您将结束意外的参考共享。请注意,Backbone.Model#clone
也是suffers from this problem。
如果您想要安全地克隆模型的数据,那么您可以通过m.toJSON()
然后JSON.stringify
发送它以获得深层副本:
JSON.parse
其中var data = JSON.parse(JSON.stringify(model_instance));
var cloned_model = new M(data);
是您的Backbone模型model_instance
的实例。
答案 1 :(得分:9)
JSON.stringify()
- 可以对任何有效的JSON表示值进行字符串化。
JSON.stringify(..)
实用程序会在遇到undefined
,function
和symbol
值时自动忽略它们。如果在 array
中找到此值,则该值将替换为null
(以便不更改数组位置信息)。如果找到 object
的属性,则只会排除该属性。
JSON字符串化具有以下特殊行为:如果object
值定义了toJSON()
方法,则首先调用此方法以获取用于序列化的值。
toJSON()
- 适用于字符串化的有效JSON值。
一个示例,JSON.stringify()
和object
中包含循环引用,将引发错误。 toJSON()
可以将其修复如下。
var o = { };
var a = {
b: 32,
c: o
};
// circular reference
o.d = a;
// JSON.stringify( a ); // an error caused by circular reference
// define toJSON method
a.toJSON = function() {
return { b: this.b };
};
JSON.stringify( a ); // "{"b":32}"
答案 2 :(得分:2)
我也在读Addy Osmani的Developing backbone.js application,我也有同样的问题。我通过在控制台中尝试他的例子(待办事项列表)来想出来。
var Todo = Backbone.Model.extend({
defaults:{
title:"",
completed:false
}
});
var todo1 = new Todo();
console.log(todo1.toJSON())
//The console shows
//Object {title: "finish your assignment", completed: false}
console.log(JSON.stringify(todo1))
//The console shows
//{"title":"finish your assignment","completed":false}