2012-01-24 4 views
2

Я знаю, что $() - это функция jQuery ... но что означает $ ({}) reference/do? Я смотрю на код Бена Alman в https://gist.github.com/705311

(function(jQuery){ 
    var o = jQuery({}); 
    jQuery.each({ 
    "subscribe" : "bind", 
    "unsubscribe" : "unbind", 
    "publish" : "trigger" 
    }, function (fn, api) { 
    jQuery[ fn ] = function() { 
     o[ api ].apply(o, arguments); 
    }; 
    }); 
})(jQuery); 

Я пытаюсь выяснить, как этот код делает то, что он делает. Может кто-то сломать его? Кроме того, что такое метод jQuery.apply()? Я не вижу его в документах jQuery - я могу найти только 4-летний плагин jQuery apply(), который, я сомневаюсь, сейчас находится в ядре.

Существует более новая, менее сложная версия на https://gist.github.com/661855, но мне более любопытно, что/как версия 0.X этого кода даже работала.

..edit .. Я понимаю, что $ ({}) - пустой объект, завернутый в jQuery. Вопрос в том, зачем это делать, и как он тогда заканчивает тем, что создал $ .subscribe(), $ .unsubscribe() и $ .publish() из этого крошечного фрагмента кода, особенно бит o[ api ].apply(o, arguments);?

+1

Другие объяснили, что делает код, но, насколько '.Не()' - это не метод JQuery, это стандартный JavaScript как [объяснено в MDN] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply). – nnnnnn

ответ

4

Этот код создает объект для использования для шаблона наблюдателя. Вот объяснение построчно:

// opening a self-executing anonymous function closure 
// assigning global variable jQuery (see last line) 
// to local argument jQuery (usually this would be $) 
(function(jQuery){ 

    // creating a jQuery selector object to access the available methods 
    // typeof $.unbind == 'undefined' 
    // typeof $({}).unbind == 'function' 
    // And more importantly this new object will be the container 
    // for our observer pattern (see below) 
    var o = jQuery({}); 

    // iterating over an object with new method keys to old method values 
    // creating syntactic sugar for an observer pattern (footnote 1) 
    jQuery.each({ 
    "subscribe" : "bind", 
    "unsubscribe" : "unbind", 
    "publish" : "trigger" 

    // here fn will be the the new method name and api will be the old one 
    }, function (fn, api) { 

    // a property of the jQuery namespace is created with the new method name 
    jQuery[ fn ] = function() { 

     // which calls the old method applying given arguments (footnote 2) 
     // to our new observer container object 
     o[ api ].apply(o, arguments); 

    }; 
    }); 
})(jQuery); 

сноска 1: см http://msdn.microsoft.com/en-us/scriptjunkie/hh201955.aspx

сноска 2: см http://odetocode.com/blogs/scott/archive/2007/07/05/function-apply-and-function-call-in-javascript.aspx

+0

Выглядит отлично! Я знаю, что функция $() - это функция, но так легко забыть/игнорировать, что объект jQuery на самом деле является функцией jQuery, причем все встроенные методы функции тоже применяются. :П – BrianFreud

0

Per http://api.jquery.com/jQuery/:

jQuery(object) 

объект Простой объект, чтобы обернуть в объект JQuery.

Таким образом, это всего лишь один из способов возврата объекта, который имеет доступные ему методы и свойства объекта jQuery - без использования каких-либо других объектов или элементов в качестве контекста. ({} - это новый объект JavaScript без каких-либо дополнительных свойств.)

api является одной из вышеуказанных строк, например. subscribe. o[ api ] возвращает функцию subscribeo. Эта функция (как и любая функция) имеет функцию apply, которая подробно описана в https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply.

0

O = jQuery ({}) инициализирует объект JQuery. JQuery [fn] = function() { o [api] .apply (o, arguments); цепочки подписки, отписки, публикации пользовательских событий для привязки, развязывания и триггера. Я думаю, что код перехватывает эти методы для привязки, отвязывания и запуска. Просто посмотрите на «Дамп объекта» в firebug.

(function(jQuery){ 
    var o = jQuery({}); 
    jQuery.each({ 
    "subscribe" : "bind", 
    "unsubscribe" : "unbind", 
    "publish" : "trigger" 
    }, function (fn, api) { 
    jQuery[ fn ] = function() { 
     o[ api ].apply(o, arguments); 

    }; 
    }); 
//watch o in firebug 
    console.log(o); 
})(jQuery); 
0
jQuery({}); 

Здесь объект JQuery создается пустой объект внутри. Когда объект jQuery передается функции $(), создается клон объекта. Этот новый объект jQuery ссылается на те же элементы DOM, что и исходный.

Пример ниже поясняется.

Клонирование JQuery объектов

// define a plain object 
var foo = {foo:'bar', hello:'world'}; 

// wrap this with jQuery 
var $foo = $(foo); 

// test accessing property values 
var test1 = $foo.prop('foo'); // bar 

// test setting property values 
$foo.prop('foo', 'foobar'); 
var test2 = $foo.prop('foo'); // foobar 
Смежные вопросы