2016-05-07 8 views
1

Я смотрел код модели веб-сайта, и у меня возник вопрос относительно прототипа. Я понимаю, что это полезно для наследования в Javascript.Модель прототипа модели базовой линии vs backbone fetch

В этом примере ...

define([], function() { 

    "use strict"; 

    /** 
    * Data Model 
    * 
    * @type {Backbone.Model} 
    */ 
    var DataModel = Backbone.Model.extend({ 

     defaults : { 

     }, 

     urlRoot : '/api/..../../..', 

     fetch : function() { 
      Backbone.Model.prototype.fetch.apply(this, arguments); 
     } 
    }); 

    return Datamodel; 
}); 

Почему мы должны делать Backbone.Model.prototype.fetch.apply(this, arguments); вместо обычного старого Model.fetch();

Я супер пупер запутаться. Зачем даже использовать прототип, чтобы что-то принести? Я не могу понять здесь.

Пожалуйста, помогите.

+0

Пожалуйста, воздержитесь от добавления подписей; кроме того, что они являются шумом и ничего не добавляют к вопросу, ваши сообщения подписываются с вашей пользовательской картой. – Daedalus

+0

будет иметь в виду, спасибо @Daedalus – TechnoCorner

ответ

4

Это делается для того, чтобы сделать предварительную предварительную проверку перед вызовом метода фактической выборки. Другими словами, мы переопределяем метод fetch с нашей пользовательской логикой, которая в конечном итоге вызывает оригинальный метод fetch, если это необходимо.

Например:

fetch : function(options) { 
    if(options.someFlag){ 
      var dfd = jQuery.Deferred(); 
      // fetch the data from localStorage 
      // dfd.resolve(resultingDataFromLocalStorage); 
      return dfd.promise(); 
    } 
    return Backbone.Model.prototype.fetch.apply(this, arguments); 
} 

Это лучшее решение, чем иметь код для принятия решения о том, как принести должно идти все мнение о том, что это применение model.fetch().

Конечно, без пользовательской логики там, как в вашем примере, это совершенно не нужно.

+3

Обратите внимание, что 'return' в ветке' if' должен возвращать обещание, потому что код может полагаться на этот интерфейс. –

+0

@ try-catch-наконец-то вы можете уточнить? Зачем вам нужно возвращать объект обещания? Если у меня есть локальные переменные? Смутно разозлился. Код действительно поможет! – TechnoCorner

+0

@TechnoCorner Представьте себе, что какой-то другой разработчик использует вашу модель ... он предположим, что это выборка возвращает jqxhr как обычные модели. Поэтому, если вы переопределите его и вернете примитив или что-то вместо этого, его код сломается. См. Обновление в ответ. –

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