Передача функций в Backbone.View.extend - PullRequest
3 голосов
/ 14 декабря 2011

Недавно я спорю с некоторыми сотрудниками о том, что я найти неверный. Мы используем Backbone в большом приложении, и мой способ создания представлений «стандартный» магистральный путь:

var MyView = Backbone.View.extend({ 
  className: 'foo', 
  initialize: function() { 
    _.bindAll(this, 'render' /* ... more stuff */); 
  }, 
  render: function() { 
    /* ... render, usually 
      using _.template and passing 
      in this.model.toJSON()... */ 
    return this; 
  } 
}); 

Но кто-то в команде недавно решил сделать это так:

var MyView = Backbone.View.extend( (function() { 
  /* 'private stuff' */ 
  function bindMethods(view) { 
    _.bindAll(view, /* ... more stuff */); 
  }; 
  function render(view) { 
     /* ... render, usually 
        using _.template and passing 
        in view.model.toJSON()... */ 
  }; 
  return { 
    className: 'foo', 
    initialize: function() { 
      bindMethods(this); 
      render(this);   
    } 
  }; 
}()); 

Это идея в псевдокоде. Прочитав исходники BB и прочитав руководства, я нахожу, что это плохая практика (для меня это не имеет смысла), но я хотел бы получить обратную связь от другие разработчики / пользователи Backbone

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Одним из преимуществ использования замыкания, которое я вижу, является предоставление закрытой области видимости для переменных и функций, которые не должны быть доступны из кода вне представления.

Несмотря на это, я не видел многоМагистральные приложения используют замыкание для определения вида / модели / коллекции и т. Д.

Вот электронное письмо от Джереми Ашкенаса, касающееся этой проблемы.

Да, использование замыканий для создания экземпляровобъекты с закрытыми переменными возможны в JavaScript.Но это плохая практика, и ее следует избегать.В частности, это не имеет ничего общего с Backbone;это природа ООП в JavaScript.

Если вы используете шаблон замыкания (также известный как шаблон «модуль»), вы создаете новую копию каждой функции для каждого создаваемого вами экземпляра.Это полностью игнорирует прототипы и ужасно неэффективно как с точки зрения скорости, так и с точки зрения использования памяти.Если вы сделаете 10 000 моделей, у вас также будет 10 000 копий каждой функции-члена.С прототипами (с Backbone.Model.extend) у вас будет только одна копия каждой функции-члена, даже если есть 10 000 экземпляров класса.

0 голосов
/ 14 декабря 2011

Я полностью согласен с Полом здесь. Иногда вам может понадобиться определить методы и свойства, которые являются частными и не могут быть испорчены извне. Я думаю, это зависит от того, нужен вам этот механизм обзора в вашем классе или нет. Смешивание обоих подходов с учетом требований, предъявляемых к классу, было бы не так уж плохо, не правда ли?

...