Відповіді:
У 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"
return this
щоб дозволити ланцюжок , щоб ви могли це зробитиfoo("bar").myPlugin().otherPlugin()
function func1 (a) { ... }
, а властивість буде змінною 'a' тут var foo = {}; foo.a = 'a'
.
jQuery.fn
визначено скорочення для jQuery.prototype
. Із вихідного коду :
jQuery.fn = jQuery.prototype = {
// ...
}
Це означає jQuery.fn.jquery
псевдонім для jQuery.prototype.jquery
, який повертає поточну версію jQuery. Знову з вихідного коду :
// The current version of jQuery being used
jquery: "@VERSION",
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, наприклад, застосовуючи різні імена класів, але врахуйте, що це лише демонстрація, щоб показати концепцію)
Ця відповідь є хорошим прикладом повноцінного розширення.
each
у своєму прикладі код? $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
спрацювало б чудово, оскільки .css()
алерадія перебирає елементи.
css
функція автоматично повторюватиме їх всередині кожного. Це був лише приклад показу різниць у тому, this
де зовнішній є об'єктом jquery, а внутрішній посилається на сам елемент.
У вихідному коді jQuery, який ми маємо, jQuery.fn = jQuery.prototype = {...}
оскільки jQuery.prototype
це об'єкт, значення jQuery.fn
will просто буде посиланням на той самий об'єкт, що іjQuery.prototype
уже посилається.
Щоб підтвердити це, ви можете перевірити, jQuery.fn === jQuery.prototype
якщо це оцінює true
(що це робить), то вони посилаються на той самий об'єкт