backbone.js toJSON()和JSON.Stringify()的区别

yjghlzjz  于 2023-06-23  发布在  其他
关注(0)|答案(3)|浏览(158)

如果需要读取或克隆模型所有数据属性,请使用其toJSON()方法。此方法将属性的副本作为对象返回(尽管名称为JSON字符串,但不是JSON字符串)。(当JSON.stringify()传递一个带有toJSON()方法的对象时,它会将toJSON()的返回值串化,而不是原始对象。上一节中的示例在调用JSON.stringify()记录模型示例时利用了这个特性。)
http://addyosmani.github.io/backbone-fundamentals/#backbone-basics
谁能告诉我这两种JSON表示法中“表示对象”的方式之间的区别?我只是困惑这些是否达到相同或有区别。

qf9go6mv

qf9go6mv1#

从精细手册:

toJSON行为

如果一个字符串化的对象有一个名为toJSON的属性,其值是一个函数,那么toJSON方法会自定义JSON字符串化行为:调用toJSON方法时返回的值将被序列化,而不是对象被序列化。
这就是为什么Backbone使用toJSON方法进行序列化,并且给定一个名为m的模型示例,您可以这样说:

var string = JSON.stringify(m);

只获取m的属性,而不是服务器不关心的一堆噪声。
也就是说,主要的区别在于toJSON产生一个值(一个数字,布尔值,对象,...)转换为JSON字符串,而JSON.stringify总是产生一个字符串。
默认的Backbone 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是Backbone模型M的示例。

sqxo8psd

sqxo8psd2#

  • JSON.stringify()-任何有效的JSON表示值都可以被字符串化。

JSON.stringify(..)实用程序在遇到undefinedfunctionsymbol值时会自动忽略它们。如果在**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}"
kr98yfug

kr98yfug3#

我也在阅读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}

相关问题