首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Backbone.js自定义构造函数?

Backbone.js自定义构造函数?
EN

Stack Overflow用户
提问于 2012-05-01 22:43:53
回答 6查看 17.5K关注 0票数 17

我正在寻找一些在我的模型上创建自定义构造函数的示例。我希望模型/数据的结构有所不同,然后将其设置为属性。

有没有人能给我演示一下如何做到这一点?

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-05-02 20:02:42

如果您确实希望覆盖构造函数,请向Backbone.Model.extend()传递一个constructor属性,例如:

代码语言:javascript
复制
var Klass = Backbone.Model.extend( {

  constructor : function ( attributes, options ) {

    // ...

  }

} );

如果要从自定义构造函数调用内置构造函数,可以执行以下操作:

代码语言:javascript
复制
var Klass = Backbone.Model.extend( {

  constructor : function ( attributes, options ) {

    Backbone.Model.apply( this, arguments );

  }

} );

或者,如果您不想在子类中重复包含父类的变量的名称,或者您不想担心该变量的值发生变化,您可以执行类似以下操作:

代码语言:javascript
复制
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 suggests的方式,但在子类中重复子类变量名,而不是父类变量名:

代码语言:javascript
复制
var Klass = Backbone.Model.extend(

  {

    constructor : function ( attributes, options ) {

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

    }

  },

  {

    parent_klass : Backbone.Model.prototype

  }

);

如果你想要更多的建议,你必须更具体地说明你想要完成什么。

在内置构造函数功能之后,您想要做的任何事情都应该在initialize()中完成。

票数 39
EN

Stack Overflow用户

发布于 2012-09-10 15:25:25

正如我在评论中提到的,在使用this.constructor.__super__ (或this.__super__)时要小心,以免陷入无尽的循环(Chrome中的Maximum call stack size exceeded)。

在控制台中尝试以下操作(风险自负,这将导致前面提到的死循环)

代码语言:javascript
复制
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

原因是在创建B时,A的构造函数中的this指向B的一个实例,因此this.constructor.__super__.constructor一直指向A的构造函数,该构造函数被一次又一次地调用。

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

代码语言:javascript
复制
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__

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2012-05-11 15:42:11

下面是我覆盖默认Backbone.Model构造函数的方法:

代码语言:javascript
复制
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构造函数:

代码语言:javascript
复制
_.extend(Backbone.Collection.prototype, {
  model: Backbone.Model
});

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10399334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档