【问题标题】:What's the difference between initialize and constructor on a backbone model骨干模型上的初始化和构造函数有什么区别
【发布时间】:2012-04-24 12:40:47
【问题描述】:

骨干模型上的初始化和构造函数有什么区别。

当我扩展主干模型 (ParentModel) 时,我使用初始化方法来设置任何默认属性。但是每当我基于 ParentModel 创建一个模型时,我都会使用构造函数来运行任何初始功能。我这样做是因为它有效,但工作中有人问我为什么同时使用初始化和构造函数,除了它有效之外我没有一个好的答案。我可以花时间阅读源代码来弄清楚它,但在这里提问并得到正确答案似乎要容易得多。

var ParentModel = Backbone.Model.extend({
  initialize : function() {
    // code here
  },
});


var Model = ParentModel.extend({
  constructor : function (options) {
    Backbone.Model.prototype.constructor.call(this, options);
    // code here
   },

【问题讨论】:

  • 请注意,正如您的 constructor() 调用基础 constructor() 一样,您应该开始覆盖 initialize()(至少在您使用此模式来扩展可能已经存在的内容的情况下)是一个扩展模型)与<base>.initialize.apply(this, arguments);,以允许任何基本定义的initialize()首先运行。 (这在 JointJS 中引起了我的注意,它已经在某些自己的派生模型上定义了自己的 initialize()。)

标签: javascript backbone.js


【解决方案1】:

constructor 在 Backbone 设置结构之前运行。 initialize 在结构的 constructor 函数内被调用。所以基本上,如果您需要在 Backbone 设置结构之前增加任何内容,请使用 constructor,如果您需要在 Backbone 设置结构之后增加任何内容,请使用 initialize

(来自Github discussion on the subject

【讨论】:

    【解决方案2】:

    constructor 是 Backbone 用来设置自己的函数 - 创建模型、设置事件以及进行各种其他设置。覆盖它时要非常小心,因为如果你通过覆盖或隐藏方法来阻止 Backbone 代码运行,你会得到难以调试的奇怪错误。

    另一方面,initialize 是 Backbone 在完成其内部管道后调用其对象的函数。如果您没有做任何专门用于干扰正常 Backbone 功能的事情,只需使用初始化。

    如果您使用的是 CoffeeScript,使用 constructor 可能更直观。 (这是给我的)。不过,请确保您始终致电super

    【讨论】:

    • 关于调用 super 的注意事项,这对我有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 2011-09-02
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2017-03-23
    相关资源
    最近更新 更多