如果您需要读取或克隆模型的所有数据属性,请使用其toJSON()方法。此方法以对象的形式返回属性的副本(尽管名称不同,但不是JSON字符串)。(当JSON.stringify()通过toJSON()方法传递给对象时,它将对toJSON()的返回值而不是原始对象进行字符串化。上一节中的示例在调用JSON.stringify时利用了此功能。 ()记录模型实例。)
http://addyosmani.github.io/backbone-fundamentals/#backbone- basics
谁能告诉我,这两种方式之间的差异representing an object的JSON符号。我只是感到困惑,无论是实现相同还是不同。
representing an object
JSON
从精美的手册中:
toJSON行为 如果要被字符串化的对象具有一个名为toJSON的属性,其值是一个函数,那么该toJSON方法将自定义JSON字符串化行为:代替被序列化的对象,toJSON方法被调用时返回的值将被序列化,而不是被序列化的对象。
toJSON行为
如果要被字符串化的对象具有一个名为toJSON的属性,其值是一个函数,那么该toJSON方法将自定义JSON字符串化行为:代替被序列化的对象,toJSON方法被调用时返回的值将被序列化,而不是被序列化的对象。
toJSON
这就是为什么Backbone使用该toJSON方法进行序列化并给定名为的模型实例的原因m,您可以这样说:
m
var string = JSON.stringify(m);
并从中获取属性,m而不是从服务器中忽略一堆噪音。
也就是说,主要区别在于toJSON产生的值(数字,布尔值,对象等)将转换为JSON字符串,而JSON.stringify始终产生一个字符串。
JSON.stringify
该默认骨干toJSON仅仅是这个(适用机型):
return _.clone(this.attributes);
这样就m.toJSON()为您提供了模型属性的 浅表 副本。如果有数组或对象作为属性值,那么您将结束意外的引用共享。注意,Backbone.Model#clone也遭受这个问题。
m.toJSON()
Backbone.Model#clone
如果您想安全地克隆模型的数据,则可以将其发送出去JSON.stringify,然后JSON.parse获得深层副本:
JSON.parse
var data = JSON.parse(JSON.stringify(model_instance)); var cloned_model = new M(data);
model_instance您的骨干模型实例在哪里M?
model_instance
M