如果需要读取或克隆模型所有数据属性,请使用其toJSON()方法。此方法将属性的副本作为对象返回(尽管名称为JSON字符串,但不是JSON字符串)。(当JSON.stringify()传递一个带有toJSON()方法的对象时,它会将toJSON()的返回值串化,而不是原始对象。上一节中的示例在调用JSON.stringify()记录模型示例时利用了这个特性。)
http://addyosmani.github.io/backbone-fundamentals/#backbone-basics
谁能告诉我这两种JSON表示法中“表示对象”的方式之间的区别?我只是困惑这些是否达到相同或有区别。
3条答案
按热度按时间qf9go6mv1#
从精细手册:
toJSON行为
如果一个字符串化的对象有一个名为
toJSON
的属性,其值是一个函数,那么toJSON
方法会自定义JSON字符串化行为:调用toJSON
方法时返回的值将被序列化,而不是对象被序列化。这就是为什么Backbone使用
toJSON
方法进行序列化,并且给定一个名为m
的模型示例,您可以这样说:只获取
m
的属性,而不是服务器不关心的一堆噪声。也就是说,主要的区别在于
toJSON
产生一个值(一个数字,布尔值,对象,...)转换为JSON字符串,而JSON.stringify
总是产生一个字符串。默认的Backbone
toJSON
如下所示(适用于型号):所以
m.toJSON()
给了你一个模型属性的浅拷贝。如果存在数组或对象作为属性值,则将终止意外的引用共享。请注意,Backbone.Model#clone
也有这个问题。如果你想安全地克隆一个模型的数据,那么你可以通过
JSON.stringify
发送它,然后通过JSON.parse
发送它以获得深拷贝:其中
model_instance
是Backbone模型M
的示例。sqxo8psd2#
JSON.stringify()
-任何有效的JSON表示值都可以被字符串化。JSON.stringify(..)
实用程序在遇到undefined
、function
和symbol
值时会自动忽略它们。如果在**array
中找到这样的值,则该值将被null
替换(因此不会更改数组位置信息)。如果被发现为object
**的属性,则该属性将被简单地排除。JSON字符串化有一个特殊的行为,如果一个
object
值定义了一个toJSON()
方法,这个方法将首先被调用以获取一个用于序列化的值。toJSON()
-转换为适合字符串化的有效JSON值。例如,
JSON.stringify()
和object
中包含循环引用,将抛出错误。toJSON()
可以按如下方式修复。kr98yfug3#
我也在阅读Addy Osmani的Developing backbone.js application,我也有同样的问题。我通过在控制台中尝试他的示例(待办事项列表)来弄清楚。