новый Backbone.Model() против Backbone.Model.extend()

Я новичок в JS и Backbone

Какая разница между этими двумя?

TestModel = new Backbone.Model({ title: "test title" })
TestModel = Backbone.Model.extend({ title: "test title" })

Ответ 1

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

Для опытных программистов я бы просто сказал, что "new Backbone.Model" возвращает экземпляр объекта, но "Backbone.Model.extend" возвращает функцию-конструктор

FIRST: новый объект (т.е. Дом)

var TestModel = new Backbone.Model({ title: "test title" });

вы создаете новый объект, структура которого (методы и переменные) были определены где-то в другом месте. Объект можно рассматривать как "все нелокальные элементы" языка, где для "родного элемента" я имею в виду базовые типы, такие как целые числа, символы и т.д.

В фигурных скобках {} вы передаете значение некоторой переменной или метода. Это называется, как ранее объяснил Томаш Нуркевич, конструктором, поскольку он позволяет вам "построить" новый объект, модель которого была описана в другом месте.

Чтобы дать вам известный пример: вы пишете

var myArray = new Array();

Это означает, что вы создаете новый массив, который является неродным объектом, который был определен в другом месте. вы также можете написать:

var myArray = new Array([1,2,3,4,5]);

И он заполняет массив заданными числами.

ВТОРОЙ: изменить определение существующего объекта (т.е. Проект дома)

с

var TestModel = Backbone.Model.extend({ title: "test title" })

вы говорите что-то очень простое для вашей виртуальной машины: "Объект, который вы мне даете по умолчанию, очень приятный, но я хочу реализовать больше функций/свойств". Таким образом, с условием "extend" вы изменяете определение объекта, добавляя или переопределяя существующий метод/свойства.

Пример: хороший пример в backbone.js задается функцией компаратора коллекции. Когда вы расширяете объект, определяющий его, "он будет использоваться для сохранения коллекции в отсортированном порядке".

Пример:

myCollection = Backbone.Collection.extend({
    comparator:function(){
        return item.get('name');
    }
});

В ЦЕЛОМ

Что вы должны делать, когда "backboning" (разработка с использованием backbone.js framework) заключается в расширении данного объекта (например, View) с помощью:

window.ButtonView = Backbone.View.extend({
    btnText:'nothingByDefault',
    myNewMethod:function(){
       //do whatever you want, maybe do something triggered by an event, for instance
    }
});

а затем использовать его где-то еще в коде, один раз для каждой кнопки, которую вы хотите обработать, включая в фигурных скобках все значения, которые вы хотите передать объекту

[...]
var submitBtn = new ButtonView({btnText:"SubmitMe!"}),
var cancelBtn = new ButtonView({btnText:"Erase All!"});

....Надеюсь это поможет...

Ответ 2

Во втором случае TestModel является конструктором, который вы можете использовать несколько раз позже для создания экземпляра модели:

var model = new TestModel();

Однако прохождение title для extend имеет другое значение. Вероятно, вы должны использовать:

var TestModel = Backbone.Model.extend({defaults: { title: "test title" }});

или передать атрибуты модели при создании объекта:

var model = new TestModel({ title: "test title" });

В первом случае, с другой стороны, TestModel уже является экземпляром модели (поэтому его следует называть testModel чтобы следовать соглашению об именовании JavaScript):

var testModel = new Backbone.Model({ title: "test title" })