In jQuery ist die fn
Eigenschaft nur ein Alias für die prototype
Eigenschaft.
Der jQuery
Bezeichner (oder $
) ist nur eine Konstruktorfunktion , und alle damit erstellten Instanzen erben vom Prototyp des Konstruktors.
Eine einfache Konstruktorfunktion:
function Test() {
this.a = 'a';
}
Test.prototype.b = 'b';
var test = new Test();
test.a; // "a", own property
test.b; // "b", inherited property
Eine einfache Struktur, die der Architektur von jQuery ähnelt:
(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
um Verkettung zu ermöglichen , so könnten Sie tunfoo("bar").myPlugin().otherPlugin()
function func1 (a) { ... }
, und eine Eigenschaft wäre hier die Variable 'a'var foo = {}; foo.a = 'a'
.jQuery.fn
ist eine Kurzform fürjQuery.prototype
. Aus dem Quellcode :Das heißt, es
jQuery.fn.jquery
handelt sich um einen Alias fürjQuery.prototype.jquery
, der die aktuelle jQuery-Version zurückgibt. Wieder aus dem Quellcode :quelle
fn
bezieht sich wörtlich auf die Abfrageprototype
.Diese Codezeile befindet sich im Quellcode:
Das eigentliche Werkzeug dahinter
fn
ist jedoch die Verfügbarkeit, um Ihre eigenen Funktionen in jQuery einzubinden. Denken Sie daran, dass jquery der übergeordnete Bereich Ihrer Funktion ist und sich daherthis
auf das jquery-Objekt bezieht.Hier ist ein einfaches Beispiel dafür. Nehmen wir an, ich möchte zwei Erweiterungen erstellen, eine, die einen blauen Rand setzt und die den Text blau färbt, und ich möchte, dass sie verkettet werden.
jsFiddle Demo
Jetzt können Sie diese gegen eine Klasse wie diese verwenden:
(Ich weiß, dass dies am besten mit CSS möglich ist, z. B. mit dem Anwenden verschiedener Klassennamen, aber bitte denken Sie daran, dass dies nur eine Demo ist, um das Konzept zu zeigen.)
Diese Antwort enthält ein gutes Beispiel für eine vollwertige Erweiterung.
quelle
each
Code in Ihrem Beispielcode nicht einfach überspringen ?$.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
würde gut funktionieren, da.css()
alerady über die Elemente iteriert.css
Funktion diese bei jedem automatisch intern durchlaufen. Es war nur ein Beispiel für die Darstellung der Unterschiede, beithis
denen das äußere das Abfrageobjekt ist und das innere auf das Element selbst verweist.Im jQuery-Quellcode, den wir haben,
jQuery.fn = jQuery.prototype = {...}
dajQuery.prototype
es sich um ein Objekt handelt, ist der Wert vonjQuery.fn
einfach ein Verweis auf dasselbe Objekt wiejQuery.prototype
bereits verwiesen wird.Um dies zu bestätigen, können Sie überprüfen,
jQuery.fn === jQuery.prototype
ob dies ausgewertet wirdtrue
(was es tut), dann verweisen sie auf dasselbe Objektquelle