JavaScript. Подробное руководство, 6-е издание, стр. 329

<b>jQuery.fn.println = function() {</b>

<b>  // Объединить все аргументы в одну строку, разделив их пробелами </b>

<b>  var msg = Array.prototype.join.call(arguments, &quot; &quot;);</b>

<b>  // Обойти в цикле все элементы в объекте jQuery</b>

<b>  this.each(function() {</b>

<b>    // В конец каждого из них добавить строку с простым текстом и &lt;br/&gt;. </b>

<b>    jQuery(this).append(document.createTextNode(msg)).append(&quot;&lt;br/&gt;&quot;);</b>

<b>  });</b>

<b>  // Вернуть объект jQuery, чтобы обеспечить возможность составления цепочек </b>

<b>  return this;</b>

<b>};</b>

Определив эту функцию

<b>jQuery.fn.println</b>
, мы получаем возможность вызывать метод
<b>println()</b>
относительно любого объекта jQuery, как показано ниже:

<b>$( &quot;#debug&quot;).println(&quot;x = ”, х, у = &quot;, у);</b>

В

<b>jQuery.fn</b>
постоянно добавляются новые методы. Если обнаружится, что приходится «вручную» выполнять обход элементов в объекте
<b>jQuery</b>
с помощью метода
<b>each()</b>
и выполнять над ними некоторые операции, - это повод задуматься о необходимости реструктуризации программного кода, чтобы переместить вызов метода
<b>each()</b>
в дополнительный метод. Если при создании такого метода следовать приемам модульного программирования и соблюдать некоторые соглашения, принятые в библиотеке jQuery, этот дополнительный метод можно назвать расширением и поделиться им с другими. Ниже приводится перечень соглашений, которым необходимо следовать при создании расширений для библиотеки jQuery:

• Не полагайтесь на идентификатор

<b>$</b>
: подключающая страница может вызывать функцию
<b>jQuery.noConflict()</b>
, после чего
<b>$()</b>
уже не будет синонимом функции
<b>jQuery()</b>
. В коротких расширениях, как в примере выше, можно просто использовать имя
<b>jQuery</b>
вместо
<b>$</b>
. Если вы создаете большое расширение, то вы наверняка обернете его единственной анонимной функцией, чтобы избежать создания глобальных переменных. В этом случае можно использовать распространенный прием передачи ссылки на функцию
<b>jQuery</b>
в виде аргумента и принимать это значение в параметре с именем $:

<b>(function($) { // Анонимная функция с одним параметром $</b>

<b>  // Здесь находится реализация расширения </b>

<b>}(jQuery)); // Вызвать функцию с объектом jQuery в виде аргумента </b>

• Если метод расширения не должен возвращать какое-то свое значение, он должен возвращать объект

<b>jQuery</b>
, чтобы этот метод можно было использовать в цепочках вызовов. Обычно этот объект передается методам в виде ссылки
<b>this</b>
, которую можно просто вернуть вызывающей программе. Метод в примере выше завершается строкой
<b>return this;</b>
. Некоторые методы можно немного сократить (и сделать их сложнее для понимания), используя еще один распространенный прием: возвращая результат метода
<b>each().</b>
Например, метод
println()
мог бы содержать программный код
<b>return this.each(function() {...});</b>

• Если метод расширения принимает более двух параметров или параметров настройки, дайте пользователю метода передавать параметры в форме объекта (как мы видели на примере метода

<b>animate()</b>
в разделе 19.5.2 и функции
<b>jQuery.ajax()</b>
в разделе 19.6.3).

• Не засоряйте пространство имен jQuery лишними методами. Правильно оформленные расширения для библиотеки jQuery определяют минимальное количество методов, образуя непротиворечивый и удобный прикладной интерфейс. Обычно расширения jQuery определяют в объекте

<b>jQuery.fn</b>
единственный метод. Этот метод принимает в первом аргументе строку и интерпретирует ее как имя функции, которой следует передать остальные аргументы. Если расширение определяет единственный метод, его имя должно совпадать с именем расширения. Если необходимо определить более одного метода, в именах методов следует использовать имя расширения в качестве префикса.

• Если расширение привязывает обработчики событий, их следует поместить в пространство имен событий (раздел 19.4.4). В качестве имени пространства имен следует использовать имя расширения.

• Если расширение использует метод

<b>data()</b>
для связывания данных с элементами, все данные следует помещать в единственный объект и хранить его как единственное значение, дав ему имя, совпадающее с именем расширения.

• Файл с программным кодом расширения должен иметь имя в формате «jquery.plugin.js», где подстроку «plugin» следует заменить на имя расширения.

Расширения могут определять новые вспомогательные функции, добавляя их в сам объект

<b>jQuery</b>
. Например:

<b>// Этот метод выводит свои аргументы (с помощью метода расширения println())</b>

<b>// в элемент с атрибутом id= &quot;debug&quot;. Если такой элемент отсутствует, он будет </b>

<b>// создан и добавлен в документ. </b>

<b>jQuery.debug = function() {</b>

<b>  var elt = jQuery(&quot;#debug&quot;); // Отыскать элемент #debug</b>

<b>  if (elt.length == 0) { // Создать, если он отсутствует</b>

<b>    elt = jQuery(&quot;&lt;div id='debug'&gt;&lt;h1&gt;Debugging Output&lt;/h1&gt;&lt;/div&gt;&quot;);</b>

<b>    jQuery(document.body). append(elt);</b>