js自定义构造函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (65)

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

有人能给我示范一下如何做到这一点吗?

提问于
用户回答回答于

如果确实要重写构造函数,请传递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 );

在子类中重复子类变量名而不是父类var名称:

var Klass = Backbone.Model.extend(

  {

    constructor : function ( attributes, options ) {

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

    }

  },

  {

    parent_klass : Backbone.Model.prototype

  }

);

如果你想要更多的建议,你必须对你想要完成的事情更加具体。

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

用户回答回答于

下面是我重写默认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作为您的模型构造器,这使得更改更加透明。

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问5 回答
  • Richel

    8 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励