if you need to read or clone all of a model’s data attributes, use its
toJSON() method. This method returns a copy of the attributes as an
object (not a JSON string despite its name). (When JSON.stringify() is
passed an object with a toJSON() method, it stringifies the return
value of toJSON() instead of the original object. The examples in the
previous section took advantage of this feature when they called
JSON.stringify() to log model instances.)
representing an object
From the fine manual:
If an object being stringified has a property named
toJSONwhose value is a function, then the
toJSONmethod customizes JSON stringification behavior: instead of the object being serialized, the value returned by the
toJSONmethod when called will be serialized.
This is why Backbone uses the
toJSON method for serialization and given a model instance called
m, you can say things like:
var string = JSON.stringify(m);
and get just the attributes out of
m rather than a bunch of noise that your server won't care about.
That said, the main difference is that
toJSON produces a value (a number, boolean, object, ...) that gets converted to a JSON string whereas
JSON.stringify always produces a string.
The default Backbone
toJSON is simply this (for models):
m.toJSON() gives you a shallow copy of the model's attributes. If there are arrays or objects as attribute values then you will end unexpected reference sharing. Note that
Backbone.Model#clone also suffers from this problem.
If you want to safely clone a model's data then you could send it through
JSON.stringify and then
JSON.parse to get a deep copy:
var data = JSON.parse(JSON.stringify(model_instance)); var cloned_model = new M(data);
model_instance is your instance of the Backbone model