Was bedeutet die fn
hier meinen?
jQuery.fn.jquery
ajsie
Was bedeutet die fn
hier meinen?
jQuery.fn.jquery
Christian C. Salvado
In jQuery ist die fn
Eigenschaft ist nur ein Alias für die prototype
Eigentum.
Die jQuery
Kennung (bzw $
) ist nur ein Konstruktorfunktionund 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"
Stimmt das garantiert? Kann ich davon ausgehen, dass ein Aufruf von jQuery.prototype genau mit jQuery.fn identisch ist? Meine Sorge ist, wenn jQuery etwas Magie macht, wenn Sie .fn aufrufen, dann sind sie nicht austauschbar
– Brandon
24. Februar 2012 um 14:08 Uhr
Oh, mir fehlt etwas.. ‘window.foo = foo’ gibt ‘foo’ einen globalen Geltungsbereich? Das ist nie neu, ich werde das zu meiner Liste der zu lernenden Techniken hinzufügen.
– EE33
5. März 2012 um 19:45 Uhr
@EE33 Wenn ich mich nicht irre, bedeutet der globale Gültigkeitsbereich in Javascript einfach, dass Ihre Variable ein Parameter des Fensterobjekts ist.
– Shawn
20. September 2012 um 17:53 Uhr
@Imray – return this
erlauben Verkettungalso könntest du tun foo("bar").myPlugin().otherPlugin()
– Rennkaulquappe
12. Februar 2015 um 1:44 Uhr
@Shawn Ich denke, es würde eine Eigenschaft genannt werden, kein Parameter, oder? Ein Parameter wäre hier die ‘a’-Variable function func1 (a) { ... }
und eine Eigenschaft wäre hier die ‘a’-Variable var foo = {}; foo.a = 'a'
.
– Zach
27. Februar 2015 um 16:00 Uhr
Travis J
fn
bezieht sich wörtlich auf die jquery prototype
.
Diese Codezeile ist im Quellcode:
jQuery.fn = jQuery.prototype = {
//list of functions available to the jQuery api
}
Aber das eigentliche Werkzeug dahinter fn
ist seine Verfügbarkeit, um Ihre eigene Funktionalität in jQuery einzubinden. Denken Sie daran, dass jquery der übergeordnete Gültigkeitsbereich Ihrer Funktion sein wird this
bezieht sich auf das jquery-Objekt.
$.fn.myExtension = function(){
var currentjQueryObject = this;
//work with currentObject
return this;//you can include this if you would like to support chaining
};
Hier ist also ein einfaches Beispiel dafür. Nehmen wir an, ich möchte zwei Erweiterungen erstellen, eine, die einen blauen Rand setzt und den Text blau färbt, und ich möchte, dass sie verkettet sind.
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;
};
Jetzt können Sie diese gegen eine Klasse wie diese verwenden:
$('.blue').blueBorder().blueText();
(Ich weiß, dass dies am besten mit CSS geschieht, z. B. durch Anwenden verschiedener Klassennamen, aber denken Sie bitte daran, dass dies nur eine Demo ist, um das Konzept zu zeigen.)
Diese Antwort enthält ein gutes Beispiel für eine vollwertige Erweiterung.
Kannst du das nicht einfach überspringen each
in deinem Beispielcode? $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
würde gut funktionieren, wie .css()
iteriert bereits über die Elemente.
– Vinczemarton
9. Mai 2013 um 12:31 Uhr
@SoonDead – Das könnten Sie sicherlich, denn wenn das jQuery-Objekt eine Sammlung enthält, dann die css
-Funktion iteriert sie automatisch intern mit each. Es war nur ein Beispiel, um die Unterschiede aufzuzeigen this
wobei das äußere das jquery-Objekt ist und das innere auf das Element selbst verweist.
– Travis J
9. Mai 2013 um 18:43 Uhr
@SoonDead Guter Kommentar, aber ich mag es wirklich, wie Travis J die Idee / das Prinzip erklärt hat. 🙂
– Sander
30. Mai 2014 um 7:53 Uhr
Dies ist der beste Kommentar – Zu wissen, dass fn nur ein Alias ist, ist bei weitem nicht so nützlich wie zu wissen, warum sich jemand darum kümmern sollte, und diese Antwort hat dies wunderbar demonstriert.
– Gerard ONeill
6. August 2015 um 19:49 Uhr
Nachdem ich die anderen Antworten durchgegangen war, fand ich, dass diese das Hauptkonzept leichter zu verstehen war. Danke. 🙂
– VivekP
10. Oktober 2019 um 6:08 Uhr
Andi E
jQuery.fn
ist eine Kurzform für definiert jQuery.prototype
. Von dem Quellcode:
jQuery.fn = jQuery.prototype = {
// ...
}
Das bedeutet jQuery.fn.jquery
ist ein Alias für jQuery.prototype.jquery
, die die aktuelle jQuery-Version zurückgibt. Wieder von der Quellcode:
// The current version of jQuery being used
jquery: "@VERSION",
Ich mag diese Antwort. Ich zeige genau, wie man die Definition im Quellcode findet und dann die Definition sinnvoll interpretiert. Die gute alte Antwortmethode “lehre einen Mann das Fischen”. +1.
– EE33
5. März 2012 um 19:39 Uhr
aber welchen Zweck hat das? Nur ein paar Tastendrücke sparen?
– schleichender
20. Februar 2015 um 10:43 Uhr
@slier: ja, so ziemlich.
– Andi E
23. Februar 2015 um 9:00 Uhr
Ich wette, es gibt einen anderen Zweck. Das Anhängen einer Funktion an $.fn führt zu einer statischen Funktion
– schleichender
23. Februar 2015 um 18:29 Uhr
Die $.fn ist ein Alias für jQuery.prototype wodurch Sie jQuery um eigene Funktionen erweitern können.
Zum Beispiel:
$.fn.something = function{}
erlaubt Ihnen zu verwenden
$("#element").something()
Die $.fn ist auch gleichbedeutend mit jQuery.fn.
Im jQuery-Quellcode haben wir jQuery.fn = jQuery.prototype = {...}
seit jQuery.prototype
ist ein Objekt, dessen Wert jQuery.fn
wird einfach ein Verweis auf dasselbe Objekt sein, das jQuery.prototype
bereits Referenzen.
Um dies zu bestätigen, können Sie überprüfen jQuery.fn === jQuery.prototype
wenn das wertet true
(was es tut), dann verweisen sie auf dasselbe Objekt