В 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
псевдоним дляjQuery.prototype.jquery
, который возвращает текущую версию jQuery. Опять из исходного кода :источник
fn
буквально относится к JQueryprototype
.Эта строка кода находится в исходном коде:
Но реальным инструментом
fn
является его доступность для подключения вашей собственной функциональности в jQuery. Помните, что jquery будет родительской областью для вашей функции, поэтомуthis
будет ссылаться на объект jquery.Вот простой пример этого. Допустим, я хочу сделать два расширения, одно из которых помещает синюю рамку и окрашивает текст в синий, и я хочу, чтобы они были связаны.
jsFiddle Demo
Теперь вы можете использовать их против такого класса:
(Я знаю, что лучше всего это делать с помощью CSS, например, применяя разные имена классов, но имейте в виду, что это просто демонстрация, чтобы показать концепцию)
Этот ответ имеет хороший пример полноценного расширения.
источник
each
в своем примере кода?$.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
будет работать нормально, так как.css()
alerady перебирает элементы.css
функция автоматически будет перебирать их внутри каждого из них. Это был просто пример, демонстрирующий различия в том,this
где внешний является объектом jquery, а внутренний ссылается на сам элемент.В исходном коде jQuery,
jQuery.fn = jQuery.prototype = {...}
поскольку у насjQuery.prototype
есть объект, значение которогоjQuery.fn
будет просто ссылкой на тот же объект, на которыйjQuery.prototype
уже есть ссылка.Чтобы подтвердить это, вы можете проверить
jQuery.fn === jQuery.prototype
, оценивает ли этоtrue
(что оно делает), тогда они ссылаются на один и тот же объектисточник