2015-03-11 4 views
0

В моем стремлении лучше понять некоторые концепции Javacript и jQuery, я выполнил следующий фрагмент кода.Объяснение синтаксиса JQuery для PubSub Design Pattern

var o = $({}); 
$.subscribe = o.on.bind(o); 
$.unsubscribe = o.off.bind(o); 
$.publish = o.trigger.bind(o); 
// Usage 
$(document.body).on('click', function() { 
    // ...yadada 
    $.publish('clicketyClack'); // Think Rocky Balboa yelling out the window: "Hey yo!" 
}); 

// And some dude listening patiently for Rocky's voice. 
$.subscribe('clicketyClack', function() { 
     console.log("You can't win, Rock"); 
}); 

Проблема: я не очень хорошо понимаю синтаксис. Что это значит? Разве мы расширяем пространство имен с помощью функции bind?

$.subscribe = o.on.bind(o); --> 
$.subscribe = $({}).on.bind($({})); 

С Jquery API:

.on(events [, selector ] [, data ], handler) 
.bind(eventType [, eventData ], handler) 

Большое спасибо за вашу помощь

+0

Это, по-видимому, довольно странный способ динамического связывания событий. Не уверен, однако, этот код, кажется, ничего не делает, если вы попробуете его (протестировали его локально и, кажется, не записали «Вы не можете победить, рок») – briosheje

+0

@briosheje: Вам нужно щелкнуть где-нибудь. – Bergi

+0

@ Берги: Я знаю, я нажал, но это не сработает. – briosheje

ответ

0

Это использование bind method эквивалентно

$.subscribe = function(event, handler) { 
    o.on(event, handler); 
}; 
$.unsubscribe = function(event, handler) { 
    o.off(event, handler); 
}; 
$.publish = function(event, data) { 
    o.trigger(event, data); 
}; 

который только определяя те глобальные вспомогательные функции с запоминающимися именами, так что вам не нужно использовать on/off/trigger на этом o объект.

+0

Я отчаянно искал привязку() с этим синтаксисом в jQuery без успеха. Теперь все яснее, это ваниль JS :-) Я думаю, что это все-таки то, что он присваивает это значение объекту o ($ ({})), чтобы издатели и подписчики имели тот же контекст. Я не прав? Большое спасибо за вашу помощь! – cyberjoac

+1

Да, вызывая все эти методы на 'o', все' handler 'получают объект' {} 'для своего контекста. – Bergi