Search code examples
javascriptbackbone.jstodomvc

Why is the new operator used for collections in todomvc dependency example


I am reading through the todomvc Backbone dependency example and noticed that the 'new' operator is used to create new collections, however the views, models, and routers, return the object itself.

Why is the new operator required for collections?

Collection

/*global define */
define([
    'underscore',
    'backbone',
    'backboneLocalstorage',
    'models/todo'
], function (_, Backbone, Store, Todo) {
'use strict';

var TodosCollection = Backbone.Collection.extend({
    // Reference to this collection's model.
    model: Todo,

    // Save all of the todo items under the `"todos"` namespace.
    localStorage: new Store('todos-backbone'),

    // Filter down the list of all todo items that are finished.
    completed: function () {
        return this.where({completed: true});
    },

    // Filter down the list to only todo items that are still not finished.
    remaining: function () {
        return this.where({completed: false});
    },

    // We keep the Todos in sequential order, despite being saved by unordered
    // GUID in the database. This generates the next order number for new items.
    nextOrder: function () {
        return this.length ? this.last().get('order') + 1 : 1;
    },

    // Todos are sorted by their original insertion order.
    comparator: 'order'
});

return new TodosCollection();
});

Model

/*global define*/
define([
    'underscore',
    'backbone'
], function (_, Backbone) {

'use strict';

var Todo = Backbone.Model.extend({
// Default attributes for the todo
// and ensure that each todo created has `title` and `completed` keys.
    defaults: {
          title: '',
          completed: false
     },

// Toggle the `completed` state of this todo item.
     toggle: function () {
         this.save({
         completed: !this.get('completed')
         });
     }
   });

return Todo;
});

Solution

  • When a module returns a new Object() it is considered a Singleton since caching would not allow the same module to get loaded again.

    The collection object I'm assuming you are looking at is therefore a Singleton. It is already instantiated so you would not need to do that.

    This is the file I'm assuming you are questioning about.

    Also, it isn't necessarily required it is just an architectural decision. Here is a great article about exporting in modules.