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


67

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

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

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
   },

1
请注意,就像constructor()调用base一样constructor(),您的覆盖initialize()应该以开头(至少在使用此模式扩展可能已经是扩展模型的情况下)<base>.initialize.apply(this, arguments);,以允许initialize()首先运行任何base-defined 。(这使我在JointJS中陷入了困境,JointJS已经在自己的initialize()某些派生模型中定义了它。)
JonBrave

Answers:


90

constructor在Backbone设置结构之前运行。initialize在结构的constructor功能内部被调用。因此,基本上,如果您需要在Backbone设置结构之前增加任何内容,请使用,constructor如果您需要在Backbone设置结构使用之后增加任何东西,请使用initialize

(摘自Github关于该主题的讨论


31

constructor是Backbone用来设置自身的功能-创建模型,设置事件以及进行各种其他设置。重写时要非常小心,因为如果通过重写或隐藏方法阻止Backbone代码运行,则会遇到难以调试的怪异错误。

initialize另一方面,Backbone在内部管道完成后会调用其对象的函数。如果您没有做任何旨在干扰正常Backbone功能的操作,请使用initialize。

如果您使用的是CoffeeScript,则使用起来可能更直观constructor。(这是给我的)。不过只要确保您总是致电即可super


1
打电话给super的注意事项对我有帮助。谢谢!
安德鲁(Andrew)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.