Що означає jQuery.fn?


Відповіді:


848

У jQuery fnвластивість є лише псевдонімом доprototype властивості.

jQueryІдентифікатор (або $) є просто функцією конструктора , і всі екземпляри , створені з ним, успадкованими від прототипу конструктора.

Проста функція конструктора:

function Test() {
  this.a = 'a';
}
Test.prototype.b = 'b';

var test = new Test(); 
test.a; // "a", own property
test.b; // "b", inherited property

Проста структура, що нагадує архітектуру jQuery:

(function() {
  var foo = function(arg) { // core constructor
    // ensure to use the `new` operator
    if (!(this instanceof foo))
      return new foo(arg);
    // store an argument for this example
    this.myArg = arg;
    //..
  };

  // create `fn` alias to `prototype` property
  foo.fn = foo.prototype = {
    init: function () {/*...*/}
    //...
  };

  // expose the library
  window.foo = foo;
})();

// Extension:

foo.fn.myPlugin = function () {
  alert(this.myArg);
  return this; // return `this` for chainability
};

foo("bar").myPlugin(); // alerts "bar"

4
Чи гарантоване це правдою? Чи можу я припустити, що виклик jQuery.prototype точно такий же, як jQuery.fn? Мене хвилює, якщо jQuery робить якусь магію, коли ви телефонуєте .fn, вони не є взаємозамінними
Брендон

4
О, я щось пропускаю .. 'window.foo = foo' дає "foo" глобальну сферу? ніколи нового, я додам це до мого списку методик навчання.
EE33

2
@ EE33 Якщо я не помиляюся, глобальна область застосування javascript просто означає, що ваша змінна є параметром віконного об’єкта.
Шон

1
@Imray - return thisщоб дозволити ланцюжок , щоб ви могли це зробитиfoo("bar").myPlugin().otherPlugin()
Racing Tadpole

3
@Shawn Я думаю, що це буде називатися властивістю, а не параметром, правда? Параметр буде тут змінною 'a' function func1 (a) { ... }, а властивість буде змінною 'a' тут var foo = {}; foo.a = 'a'.
Зак

145

jQuery.fnвизначено скорочення для jQuery.prototype. Із вихідного коду :

jQuery.fn = jQuery.prototype = {
    // ...
}

Це означає jQuery.fn.jqueryпсевдонім для jQuery.prototype.jquery, який повертає поточну версію jQuery. Знову з вихідного коду :

// The current version of jQuery being used
jquery: "@VERSION",

15
Мені подобається ця відповідь. Я точно показує, як знайти визначення всередині вихідного коду, а потім як інтерпретувати визначення корисним чином. Хороший ол "навчить людину ловити рибу" метод відповіді. +1.
EE33

але яка мета цього робити? просто заощадження пари натискання клавіш?
slier

@slier: так, дуже багато.
Енді Е

Сподіваюся, є інша мета .. приєднати функцію до $ .fn, зробить статичну функцію
slier

144

fn буквально відноситься до jquery prototype .

Цей рядок коду знаходиться у вихідному коді:

jQuery.fn = jQuery.prototype = {
 //list of functions available to the jQuery api
}

Але справжнім інструментом fnє його доступність підключити власну функціональність до jQuery. Пам'ятайте, що jquery буде батьківською сферою вашої функції, тому thisбуде посилатися на об'єкт jquery.

$.fn.myExtension = function(){
 var currentjQueryObject = this;
 //work with currentObject
 return this;//you can include this if you would like to support chaining
};

Тож ось простий приклад цього. Скажімо, я хочу зробити два розширення, одне з яких додає синю облямівку і яке забарвлює текст у синій колір, і я хочу, щоб вони були приковані.

jsFiddle Demo

$.fn.blueBorder = function(){
 this.each(function(){
  $(this).css("border","solid blue 2px");
 });
 return this;
};
$.fn.blueText = function(){
 this.each(function(){
  $(this).css("color","blue");
 });
 return this;
};

Тепер ви можете використовувати їх проти такого класу:

$('.blue').blueBorder().blueText();

(Я знаю, що це найкраще робити з css, наприклад, застосовуючи різні імена класів, але врахуйте, що це лише демонстрація, щоб показати концепцію)

Ця відповідь є хорошим прикладом повноцінного розширення.


11
Ви не можете просто пропустити eachу своєму прикладі код? $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };спрацювало б чудово, оскільки .css()алерадія перебирає елементи.
Незабаром

6
@SoonDead - Ви, звичайно, могли б, тому що якщо об'єкт jQuery містить колекцію, то cssфункція автоматично повторюватиме їх всередині кожного. Це був лише приклад показу різниць у тому, thisде зовнішній є об'єктом jquery, а внутрішній посилається на сам елемент.
Travis J

1
@SoonDead Добрий коментар, але мені дуже подобається, як Тревіс Дж пояснив ідею / принцип. :)
Сандер

5
Це найкращий коментар. Знання того, що fn - це лише псевдонім, не є настільки корисним, як знання того, чому хтось повинен піклуватися, і ця відповідь це прекрасно продемонструвала.
Джерард ONeill

1
Переглянувши інші відповіді, я виявив, що цю проблему легше зрозуміти головну концепцію. Дякую. :)
VivekP

0

У вихідному коді jQuery, який ми маємо, jQuery.fn = jQuery.prototype = {...}оскільки jQuery.prototypeце об'єкт, значення jQuery.fnwill просто буде посиланням на той самий об'єкт, що іjQuery.prototype уже посилається.

Щоб підтвердити це, ви можете перевірити, jQuery.fn === jQuery.prototypeякщо це оцінює true(що це робить), то вони посилаються на той самий об'єкт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.