一尘不染

toJSON()和JSON.Stringify()之间的区别

json

如果您需要读取或克隆模型的所有数据属性,请使用其toJSON()方法。此方法以对象的形式返回属性的副本(尽管名称不同,但不是JSON字符串)。(当JSON.stringify()通过toJSON()方法传递给对象时,它将对toJSON()的返回值而不是原始对象进行字符串化。上一节中的示例在调用JSON.stringify时利用了此功能。
()记录模型实例。)

http://addyosmani.github.io/backbone-fundamentals/#backbone-
basics

谁能告诉我,这两种方式之间的差异representing an objectJSON符号。我只是感到困惑,无论是实现相同还是不同。


阅读 425

收藏
2020-07-27

共1个答案

一尘不染

精美的手册中

toJSON行为

如果要被字符串化的对象具有一个名为toJSON的属性,其值是一个函数,那么该toJSON方法将自定义JSON字符串化行为:代替被序列化的对象,toJSON方法被调用时返回的值将被序列化,而不是被序列化的对象。

这就是为什么Backbone使用该toJSON方法进行序列化并给定名为的模型实例的原因m,您可以这样说:

var string = JSON.stringify(m);

并从中获取属性,m而不是从服务器中忽略一堆噪音。

也就是说,主要区别在于toJSON产生的值(数字,布尔值,对象等)将转换为JSON字符串,而JSON.stringify始终产生一个字符串。

默认骨干toJSON仅仅是这个(适用机型):

return _.clone(this.attributes);

这样就m.toJSON()为您提供了模型属性的 浅表
副本。如果有数组或对象作为属性值,那么您将结束意外的引用共享。注意,Backbone.Model#clone遭受这个问题

如果您想安全地克隆模型的数据,则可以将其发送出去JSON.stringify,然后JSON.parse获得深层副本:

var data         = JSON.parse(JSON.stringify(model_instance));
var cloned_model = new M(data);

model_instance您的骨干模型实例在哪里M

2020-07-27