Расширение без переопределения

#javascript #backbone.js #xui

#javascript #backbone.js #xui

Вопрос:

Я пытаюсь добиться совместимости между XUI и Backbone, но я столкнулся с проблемой в своем дизайне. Я думаю.

Вот оно. Я хочу расширить XUI с помощью вызова метода attr , который мог бы обрабатывать хэш attributes/values . jQuery выполняет, и Backbone использует его. Вот почему я хочу это сделать.

К сожалению, в XUI уже есть attr метод. Итак, когда я делаю:

 xui.extend({
  attr:   function (attributes) {
    if (typeof attributes == "object") {
      for (var attr in attributes) {
        this.attr(attr, attributes[attr]);
      }
    };
  }
});
  

Конечно, в прототипе XUI есть только один метод attr. Мой. Как я могу иметь два?

Доступно что-то, делающее следующее:

 xui(element).attr('attr', 'value');
xui(element).attr({'attr': 'value', 'foo': 'bar'});
  

Спасибо за чтение и помощь 🙂

Ответ №1:

Вам нужно сохранить ссылку на исходную функцию, а затем посмотреть на аргументы, с которыми вызывается функция, чтобы определить, следует ли вам вызывать свою собственную версию или оригинал.

Что-то вроде этого (не тестируемый код, поэтому используйте только для вдохновения):

 var originalAttr = xui.attr;

xui.attr = function () {
  if(typeof arguments[0] === 'string') {
   originalAttr.apply(this, arguments);
  }
  else if(typeof arguments[0] === 'object') {
    for (var attr in attributes) {
      originalAttr.call(this, attr, attributes[attr]);
    }
  }
  else {
   /* unsupported arguments */
  }
};
  

Комментарии:

1. Большое спасибо! Я немного подумал об этом после публикации. Это делает работу, даже если мои модульные тесты работают один раз на два.