2011-12-27 4 views
4

Люди используют Backbone.View разными способами, и я немного смущен. Я видел:Понимание Backbone.View

Backbone.View.extend({}); 
new Backbone.View.extend({}); 
new Backbone.View(); 
new Backbone.View; 

Первые три являются другого. Последние два одинаковы. (См. here для скрипки.) Что происходит в каждом случае?

ответ

2

Все одно и то же.

Когда вы расширяете класс, используя Backbone.View.extend({}), как вы можете видеть, вы не добавляете какое-либо дополнительное свойство или метод в свой класс. Вы передаете ему пустой хеш {} в качестве аргумента. Итак, Backbone.View и Backbone.View.extend({}) - это почти то же самое.

О присутствии new ключевых слов перед этим, это просто стимулирует новый класс. Если вы не используете ключевое слово new, вы просто говорите о классах, тогда как с ключевым словом new вы говорите об объекте этого самого класса.

Parentesis не является обязательством. Это требуется только в том случае, если вы хотите передать аргументы своему конструктору, поэтому new Backbone.View() и new Backbone.View; - это то же самое, что и new Backbone.View() и new Backbone.View.extend({}) по причинам, которые я написал ранее.

Об этом скрипки (http://jsfiddle.net/C2Z34/):

  • myView1 класс, который расширяет View
  • myView2 (с parentesis как в моей скрипке) является объектом класс расширенный Backbone.View
  • myView3 является объектом класса Backbone.View. Он не распространяется.
  • myView4 же, как myView3
+0

'Backbone.View' и' Backbone.View.extend() 'are * different *. См. [This Fiddle] (http://jsfiddle.net/C2Z34/1/). – Randomblue

+1

(не могу запустить примеры Fiddle, поэтому я использовал консоль Chrome) @gustavotkg по-прежнему прав. Консоль сообщает вам, что первые три разные. Однако 'Backbone.View' и' Backbone.View.extend() 'похожи. Используя 'new Backbone.View' и' new (Backbone.View.extend()), оба вызывают конструктор вида и возвращают похожие объекты, хотя 'Backbone.View.extend()' принимает объезд через возвращаемую им функцию [inherits , в строке 1096]. 'new Backbone.View.extend()', обратите внимание на отсутствующие скобки, это более или менее JSWTF. Я ожидаю, что это вызовет 'new (Backbone.View.extend()), и это не так. – Wieczo

+0

@wieczo: Спасибо. Ваш комментарий о скобках очень полезен. Я был в замешательстве. – Randomblue

-1

Продлить создает подкласс. В ваших примерах вы не добавляете какой-либо пользовательский код, поэтому viewclasses ведут себя точно так же, как и исходные представления. С помощью нового ключевого слова вы вызываете функцию-конструктор вашего класса, которая возвращает экземпляр представления. Итак, если вы хотите иметь собственный код в представлении, например. с функцией рендеринга вы расширяете вид BB. Затем, когда вы хотите использовать это представление, вы создаете новый экземпляр расширенного представления.

+0

Я в замешательстве. 'new Backbone.View.extend ({});' does * not * возвращает экземпляр. Он возвращает функцию. – Randomblue

+0

Возможно, это связано с тем, что это утверждение смущает порядок вызовов методов.Вам вряд ли понадобится этот комбинированный оператор, поскольку вы можете создать только один экземпляр расширенного класса. Вызов: новый (Backbone.View.extend ({})) должен работать должным образом. – ProTom

+0

Новое выражение перед вызовом метода, например: «new hello();» не будет выполнять вызов функции, но использовать этот метод как функцию-конструктор нового объекта, который был создан через new. Таким образом, ваша функция продолжения используется как функция-конструктор совершенно нового объекта. Это не JSWTF, потому что в JS-функциях есть объекты (и, следовательно, классы), поэтому вызов new создает новый экземпляр. – ProTom

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