4

I was trying to extend backbone collections, the first way i was doing new in the declaration and in the second I declared first and then I created a new instance. Is doing the first wrong, what is the difference?

var AppointmentList = new Backbone.Collection.extend({
  model: Appointment
});

and

var AppointmentList = Backbone.Collection.extend({
  model: Appointment
});

var aptlist = new AppointmentList();
whatf
  • 6,378
  • 14
  • 49
  • 78

1 Answers1

8

The first one will break

var Appointment = Backbone.Model.extend({
    defaults: {
        "time": "0000",
        "note": "This is an appointment"
    }
});


var AppointmentList = new Backbone.Collection.extend({

    model: Appointment

});

var aptlist = new AppointmentList();

In in Backbone.js we have

  var extend = function(protoProps, staticProps) {

    var parent = this;
    var child;


    if (protoProps && _.has(protoProps, 'constructor')) {
      child = protoProps.constructor;
    } else {
      child = function(){ return parent.apply(this, arguments); };
    }

    _.extend(child, parent, staticProps);


    var Surrogate = function(){ this.constructor = child; };

    Surrogate.prototype = parent.prototype;

    child.prototype = new Surrogate;


    if (protoProps) _.extend(child.prototype, protoProps);


    child.__super__ = parent.prototype;

    return child;

  };

If you instantiate Backbone.Collection.extend with the new operator, then the var parent = this will refer to the extend object, but if you don't use new then var parent = this will refer to Backbone.Collection and since you can only call .apply on functions, the code will break here:

child = function(){ return parent.apply(this, arguments); };

parent will be an object. Backbone.Collection is a function

richie
  • 2,448
  • 3
  • 19
  • 21