Разница между jQuery.extend и jQuery.fn.extend?


83

Я пытаюсь понять синтаксис плагина jquery, потому что хочу объединить два плагина в один. Мигатель, который также должен иметь возможность останавливать интервал или запускаться несколько раз.

В любом случае, совпадает ли этот синтаксис с

jQuery.fn.extend({
    everyTime: function(interval, label, fn, times) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, times);
        });
    },
    oneTime: function(interval, label, fn) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, 1);
        });
    },

это

$.fn.blink = function(options)
    {

потому что похоже, что первый (без =) - это способ установить сразу несколько методов. Это правильно? Также, пока я здесь. Какая причина для добавления элементов и некоторой логики в объект jquery?

jQuery.extend({
    timer: {
        global: [],
        guid: 1,
        dataKey: "jQuery.timer",

(это из плагина таймера)


Если вы изучаете разработку пользовательского плагина jQuery, я рекомендую прочитать эту ветку stackoverflow.com/questions/1117086/…
CrandellWS

Ответы:


89

jQuery.extend используется для расширения любого объекта дополнительными функциями, но jQuery.fn.extend используется для расширения объекта jQuery.fn, который фактически добавляет несколько функций плагина за один раз (вместо того, чтобы назначать каждую функцию отдельно).

jQuery.extend :

var obj = { x: function() {} }

jQuery.extend(obj, { y: function() {} });

// now obj is an object with functions x and y

jQuery.fn.extend :

jQuery.fn.extend( {
        x: function() {},
        y: function() {}
});

// creates 2 plugin functions (x and y)

1
спасибо, это ясно о назначении нескольких объектов, но я все еще не уверен, когда следует использовать jquery.extend. Зачем передавать то, что вы делаете в fn.extend, в jquery.extend? Я также могу задать новый вопрос по этому поводу, потому что я задал два вопроса.
Ричард

13
jQuery.extend () на самом деле удобная функция, которую можно использовать в вашем собственном коде javascript для расширения объектов общим способом. Это часть «служебных» функций в jQuery (не используется для манипуляций с DOM)
Филипп Лейберт

74
jQuery.extend({
    abc: function(){
        alert('abc');
    }
});

Использование: $.abc(). (Селектор вроде не требуется $.ajax().)

jQuery.fn.extend({
    xyz: function(){
        alert('xyz');
    }
});

Использование: $('.selector').xyz(). (Требуется селектор вроде $('#button').click().)

В основном это используется для реализации $.fn.each().

Я надеюсь, что это помогает.


21

Разница между jQuery.extend и jQuery.fn.extend?

Собственно, кроме их базовой ссылки, ничего нет. В исходном коде jQuery вы можете прочитать:

jQuery.extend = jQuery.fn.extend = function() { … };

Итак, как это работает? В документации говорится:

Объединяет содержимое двух или более объектов в первый объект.

Это просто цикл for-in-loop, который копирует свойства, дополненный флагом для рекурсии вложенных объектов. И еще одна особенность:

Если указан только один аргумент $.extend(), это означает, что целевой аргумент был опущен.

 // then the following will happen:
 target = this;

Поэтому, если функция вызывается jQueryсама по себе (без явной цели), она расширяет пространство имен jQuery. И если функция вызывается jQuery.fn(без явной цели), она расширяет объект-прототип jQuery, в котором расположены все методы (плагина).


Мой голос за !!!! к этому . я смотрел исходный код, чтобы увидеть, как jQuery расширяется
dekdev

15

У этого сообщения в блоге есть хорошее описание:

$.fn.extend({
myMethod: function(){...}
});
//jQuery("div").myMethod();

$.extend({
myMethod2: function(){...}
});
//jQuery.myMethod2();

Цитаты:

Как правило, вы должны расширять объект jQuery для функций и объект jQuery.fn для методов. К функции, в отличие от метода, нет прямого доступа из DOM.


1
Что означает доступ к методу «непосредственно из DOM» ?
Дэн Ниссенбаум

1
directly from the DOMотносится к очень простой концепции JavaScript вызова функции и вызова свойства / прототипа объекта (в оболочке jQuery вокруг собственных объектов DOM). Посмотрите пример и попытайтесь найти разницу и подумайте, почему код в примерах не является взаимозаменяемым.
gavenkoa

10
$.fn.something= function{};

указывает на jQuery.prototype и позволяет получить доступ к элементам dom через "this". Теперь вы можете использовать $(selector).something();Итак, это работает как функция плагина, например$(selector).css();

$.something = function{};

добавляет свойство или функцию к самому объекту jQuery, и вы не можете использовать this для доступа к dom. Теперь вы можете использовать его как $.something(); это работает как функция полезности как$.trim()

но

$.fn.extend({function1(), function2()}) and  $.extend({function1(), function2()}) 

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.