Позвоночник.Wreqr против объектов JavaScript


Каковы основные преимущества костяка.wreqr имеет над объектом js , оба случая имеют доступ к агрегатору событий marionette.
Не будет ли назначение / вызов методов из объекта работать так же, как команды / RequestResponse. Для меня я не вижу никакой необходимости реализовывать это, кроме придания семантической/читабельности a +1.

Https://github.com/marionettejs/backbone.wreqr
Может кто-нибудь просветит меня, это мой первый костяк (и модульный) приложение.

2 7

2 ответа:

Преимущества следующие:

  • обработка событий и команд необязательна, и вам не нужно самостоятельно проверять наличие undefineds
  • необязательно несколько обработчиков для каждого события
  • ленивое выполнение команд (сначала вызовите событие, затем зарегистрируйте команду, и она будет немедленно выполнена)
  • Вы можете определить область выполнения без использования каких-либо дополнительных методов, таких как $.proxy,...

Он обеспечивает реализацию нескольких распространенных шаблонов обмена сообщениями , включая шаблон агрегатора событий , командный шаблон и шаблон наблюдателя.

Эти шаблоны облегчают развязку реализаций для уменьшения зависимостей объектов. Рассмотрим простую игру в стиле "бой", состоящую из танка и нескольких целей. Без шаблонов обмена сообщениями танк должен иметь четкое представление о целях и о том, как они работают, и фактически не может существуют без определения target:
var Tank = function(targets) { this.targets = targets };
Tank.prototype.fire = function() {
    var self = this,
        HpLoss = -500;
    _.each(this.targets, function(target) {
    if (self.isNear(target.coordinates) && target.canWithstand(HpLoss)) {
          target.die();
    }
}


var target1 = new Target(coordinatesA, armorA);
var target2 = new Target(coordinatesB, armorB);
var tank = new Tank([target1, target2]);

Используя шаблоны обмена сообщениями, такие как Observer, tank в приведенном выше коде не нуждается в знании своих целей; скорее, цели могут определить для себя, должны ли они умереть:

var Target = function() {}
Target.prototype.calculateDamage = function(coordinates, damage) {
    if (this.isNear(coordinates) && !this.canWithstand(damage)) {
        this.die();
    }
}

var Tank = function() {};
Tank.prototype.fire = function() {
    this.trigger('fire', { damage: 400, coordinates: this.location });
};

// Now Tank is entirely self-contained, and some external mediator can 
// make things happen at will:

function main() {
    var target1 = new Target(coordinatesA, armorA);
    var target2 = new Target(coordinatesB, armorB);
    var tank = new Tank();

    target1.listenTo(tank, 'fire', target1.calculateDamage, target1);
    target2.listenTo(tank, 'fire', target2.calculateDamage, target2);

    tank.fire();

    var target3 = new Target3(coordinatesB, armorB);
    target3.listenTo(tank, 'fire', target3.calculateDamage, target3);
}