Backbone.js的自定义构造函数?(Backbone.js custom constructo

2019-07-29 05:40发布

我正在寻找一个在我的模型创建自定义构造函数的一些例子。 我想要的结构模型/数据不同则仅仅将其设置为属性。

有人能告诉我如何做到这一点一些基本的例子吗?

谢谢!

Answer 1:

如果你真的想重写构造函数,传递一个constructor属性Backbone.Model.extend()例如:

var Klass = Backbone.Model.extend( {

  constructor : function ( attributes, options ) {

    // ...

  }

} );

如果你想从您的自定义构造函数中调用内置的构造函数,你可以这样做:

var Klass = Backbone.Model.extend( {

  constructor : function ( attributes, options ) {

    Backbone.Model.apply( this, arguments );

  }

} );

或者,如果你不想有重复包含父类中的所有在子类中的变量的名称,或者你不想担心变量变化的值,你可以这样做如下:

var Klass;

var parent_klass = Backbone.Model.prototype;

( function ( parent_klass ) {

  Klass = parent_klass.constructor.extend( {

    constructor : function ( attributes, options ) {

      parent_klass.constructor.apply( this, arguments );

    }

  } );

} )( parent_klass );

或者,如果你喜欢的方式@Claude建议 ,但子类而不是父类的变量名称中重复的子类变量名:

var Klass = Backbone.Model.extend(

  {

    constructor : function ( attributes, options ) {

      Klass.parent_klass.constructor.apply( this, arguments );

    }

  },

  {

    parent_klass : Backbone.Model.prototype

  }

);

如果你想比这更多的建议,你就必须要更具体的了解你想要完成的任务。

凡是你只是想在内置构造功能后做,你应该做initialize()



Answer 2:

正如我在评论提到,使用时要小心this.constructor.__super__ (或this.__super__ ),免得你们死循环结束( Maximum call stack size exceeded在Chrome)。

尝试在控制台下(在自己的风险,这将导致上述提到的无限循环)

var A = Backbone.Model.extend({constructor: function () {
  console.log("log: A");
  this.constructor.__super__.constructor.apply(this, arguments);
}});

var B = A.extend({constructor: function () {
  console.log("log: B");
  this.constructor.__super__.constructor.apply(this, arguments);
}});

new A();
//  log: A
//  > Backbone.model.extend.constructor
new B();
//  log: B
//  (8192) log: A
//  > RangeError: Maximum call stack size exceeded

原因是当创建Bthis在构造函数中的A点的实例B ,所以this.constructor.__super__.constructor保持向的构造指着A ,它被再次调用时间和时间。

如果你想“预期的行为”,请使用以下语法之一:

var A = Backbone.Model.extend({constructor: function () {
  console.log("log: A");
  A.__super__.constructor.apply(this, arguments);
}});

var B = A.extend({constructor: function () {
  console.log("log: B");
  B.__super__.constructor.apply(this, arguments);
}});

new A();
//  log: A
//  > Backbone.model.extend.constructor
new B();
//  log: B
//  log: A
//  > A.extend.constructor

或的情况下直接__super__

var A = Backbone.Model.extend({constructor: function () {
  console.log("log: A");
  Backbone.Model.apply(this, arguments);
}});

var B = A.extend({constructor: function () {
  console.log("log: B");
  A.apply(this, arguments);
}});

new A();
//  log: A
//  > Backbone.model.extend.constructor
new B();
//  log: B
//  log: A
//  > A.extend.constructor


Answer 3:

这是我如何覆盖默认的构造函数Backbone.Model:

Backbone.Model = (function(Model) {
  // Define the new constructor
  Backbone.Model = function(attributes, options) {
    // Your constructor logic here
    // ...
    // Call the default constructor if you wish
    Model.apply(this, arguments);
    // Add some callbacks
    this.on('event', this.myCallback, this);
  };
  // Clone static properties
  _.extend(Backbone.Model, Model);      
  // Clone prototype
  Backbone.Model.prototype = (function(Prototype) {
    Prototype.prototype = Model.prototype;
    return new Prototype;
  })(function() {});
  // Update constructor in prototype
  Backbone.Model.prototype.constructor = Backbone.Model;
  return Backbone.Model;
})(Backbone.Model);

之后,你必须确保Backbone.Collection原型使用更新Backbone.Model构造函数:

_.extend(Backbone.Collection.prototype, {
  model: Backbone.Model
});

在我看来,这种方法的“优势”是,你可以继续使用Backbone.Model作为模型的构造,这使得变化更加透明。



Answer 4:

如果你想自己来写你的模型,就像这样:

var YourModel = function () {
    // your constructor here
};

_.extend(YourModel.prototype, Backbone.Model.prototype, {
    // your model method here
});

要小心,我认为你需要咨询Backbone.Model构造的源代码 。 但我认为这不是一个好主意。 覆盖initialize方法的正确方法是:

var YourModel = Backbone.Model.extend({
    initialize: function (attrs, options) {
        Backbone.Model.prototype.initialize.apply(this, arguments); // call super constructor

        // your constructor code here
    }
});


Answer 5:

这听起来像你正在寻找的initialize方法。 当你创建一个新的模式,它被称为,如果任何你需要它,你可以使用:

var myModel = Backbone.Model.extend({
  initialize: function() {
    // do something besides setting attributes or model
    alert('myModel is ready for action!');
  }
});

new myModel();

如果你正在寻找做一些更多的参与,您可能会覆盖constructor的骨干核心方法。 这是一个棘手得多业务,虽然。 要好得多,如果你可以用公开的方法工作!



Answer 6:

一个需要注意重写Backbone.Model构造函数时的-如果你不叫Backbone.Model.apply那么Model.cid可能无法设置。

这是很糟糕 - 如果CID不是跨多个模型设定,收集可能认为这是你的集合中的第一个模型的副本 - 并不会允许添加它。



文章来源: Backbone.js custom constructor?