2012-04-12 2 views
63

В чем разница между инициализацией и конструктором на базовой модели.В чем разница между инициализацией и конструктором на базовой модели

Когда я расширяю базовую модель (ParentModel), я использую метод initialize для установки любых свойств по умолчанию. Но всякий раз, когда я создаю модель на основе 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 
    }, 
+1

Помните, что, поскольку ваш 'constructor()' вызывает конструктор base() ', вы должны начинать переопределять' initialize() '(по крайней мере, в том случае, если вы используете этот шаблон для расширения того, что может уже являетесь расширенной моделью) с ' .initialize.apply (this, arguments);', чтобы разрешить запуск с помощью инициализации() сначала определяемой базой. (Это уловило меня в JointJS, у которого уже есть свой 'initialize()', определенный на некоторых из его собственных производных моделей.) – JonBrave

ответ

84

constructor работает до того, как базовая конструкция создаст структуру. initialize вызывается внутри функции constructor. Поэтому в основном, если вам нужно увеличить что-либо до того, как Backbone настроит структуру, используйте constructor, если вам нужно увеличить что-либо после того, как Backbone настроит структуру, используя initialize.

(от Github discussion on the subject)

+1

Спасибо за отзыв boyo – screenm0nkey

30

constructor это функция, которая Backbone использует для позиционировала себя - создание моделей, настройка событий и делать все виды других настроек. Будьте очень осторожны, чтобы переопределить это, потому что если вы предотвратите запуск кода Backbone, переопределив или затеняя метод, вы получите странные ошибки, которые трудно отлаживать.

initialize С другой стороны, это функция, которую Магистраль называет своими объектами, когда она закончила с внутренней сантехникой. Если вы не делаете ничего, что специально предназначено для вмешательства в нормальную функциональность Backbone, просто используйте initialize.

Если вы используете CoffeeScript, может быть более понятным использовать constructor. (Это для меня). Просто убедитесь, что вы всегда звоните super.

+1

Хорошая заметка о вызове super, что мне помогло. Благодаря! – Andrew

Смежные вопросы