2013-12-09 9 views
2

Я новичок в Backbone.js, и в моем недавнем проекте мне нужен специальный механизм проверки моделей. Я вижу два способа сделать это.Переопределение прототипа прототипа модели и расширение модели

  1. Расширение сферы Backbone.Model.prototype

    _.extend (Backbone.Model.prototype, { ... });

  2. Создание собственной модели, которая унаследует от Backbone модели

    MyApp.Model = Backbone.Model.extend ({...});

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

ответ

1

Предполагается использовать второй подход, вот и вся ссылка Backbone.Model.extend ({}).

Он уже делает ваш первый подход + другие близкие трюки, чтобы на самом деле настроить правильную цепочку наследования (_.extend выполняет только копию свойств объекта, вы можете найти разницу в коде для расширения Backbone() и подписи под Underscore _.extend, они очень большие и не очень интересные. Простого расширения .prototype недостаточно для «реального» наследования).

Когда я впервые прочитал ваш вопрос, я неправильно понял и подумал, что вы спрашиваете, следует ли продлевать его из собственного класса модели или напрямую продлевать его из Backbone Extend. Это не ваш вопрос, поэтому я приношу свои извинения за первый ответ и просто хочу сделать здесь краткое изложение: вы можете использовать оба подхода. Большинство крупных веб-сайтов, которые я видел или работал вначале, простираются от Backbone.Model, чтобы создать общий MyApp.Model (вот почему я запутался, это обычно имя, которое они ему дают :)), который предназначен для ЗАМЕНИТЬ Backbone.Model , Затем для каждой модели (например, User, Product, Comment, whatever ..) они будут распространяться на этот MyApp.Model, а не на Backbone.Model. Таким образом, они могут модифицировать некоторые глобальные свойства Backbone (для всех своих моделей) без изменения кода Backbone.

+0

Какую боль я буду испытывать, если буду использовать первый подход? – VJAI

+0

Хм, я думаю, что мой ответ не очень ясен, позвольте мне перефразировать его. – Enders

+0

Спасибо, все-таки у меня нет ответа на этот вопрос: «Какие проблемы я буду сталкиваться, если пойду с первым подходом?» – VJAI

1

_.extend(Backbone.Model.prototype, {...mystuff...}) добавит вашу собственность каждые Backbone.Model и объекты на ее основе. Возможно, вы имели в виду сделать противоположное: _.extend({...mystuff...}, Backbone.Model), который не изменит сам Маг.

Если вы посмотрите на annotated Backbone source вы увидите линии, как

_.extend(Collection.prototype, Events, { ... Collection functions ...}) 

Это складывает События объекта содержимого каждой коллекции, наряду с некоторыми другими функциями сбора. Кроме того, каждая модель имеет события:

_.extend(Model.prototype, Events, { ... Model functions ...}) 

Это, кажется, общая схема создания «классов» в Javascript:

function MyClass(args) { 
    //Do stuff 
} 

MyClass.prototype = {....} 

Он используется даже в исходном коде Firefox.

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