W jQuery fn
właściwość jest tylko aliasem prototype
właściwości.
jQuery
Identyfikator (lub $
) jest tylko funkcja konstruktora , a wszystkie instancje stworzone z nim dziedziczyć z prototypu konstruktora.
Prosta funkcja konstruktora:
function Test() {
this.a = 'a';
}
Test.prototype.b = 'b';
var test = new Test();
test.a; // "a", own property
test.b; // "b", inherited property
Prosta struktura, która przypomina architekturę 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
aby umożliwić tworzenie łańcuchów , abyś mógł to zrobićfoo("bar").myPlugin().otherPlugin()
function func1 (a) { ... }
, a właściwością byłaby tutaj zmienna „a”var foo = {}; foo.a = 'a'
.jQuery.fn
jest zdefiniowany jako skrótjQuery.prototype
. Z kodu źródłowego :To oznacza
jQuery.fn.jquery
alias dlajQuery.prototype.jquery
, który zwraca bieżącą wersję jQuery. Znów z kodu źródłowego :źródło
fn
dosłownie odnosi się do jqueryprototype
.Ten wiersz kodu znajduje się w kodzie źródłowym:
Ale prawdziwym narzędziem stojącym za tym
fn
jest jego dostępność do podłączenia własnej funkcjonalności do jQuery. Pamiętaj, że jquery będzie nadrzędnym zakresem dla twojej funkcji, więcthis
będzie odnosić się do obiektu jquery.Oto prosty tego przykład. Powiedzmy, że chcę zrobić dwa rozszerzenia, z których jedno ustawia niebieską ramkę i które koloruje tekst na niebiesko, i chcę, aby były powiązane.
jsFiddle Demo
Teraz możesz użyć tych przeciwko takiej klasie:
(Wiem, że najlepiej to zrobić przy użyciu css, takich jak stosowanie różnych nazw klas, ale pamiętaj, że to tylko demonstracja pokazująca koncepcję)
Ta odpowiedź ma dobry przykład pełnego rozszerzenia.
źródło
each
kodu przykładowego?$.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
działałoby dobrze, ponieważ.css()
alerady iteruje po elementach.css
funkcja automatycznie iteruje nad nimi wewnętrznie z każdym z nich. Był to tylko przykład pokazania różnic, wthis
których zewnętrzny jest obiektem jquery, a wewnętrzny odwołuje się do samego elementu.W kodzie źródłowym jQuery, który mamy,
jQuery.fn = jQuery.prototype = {...}
ponieważjQuery.prototype
jest to obiekt, którego wartośćjQuery.fn
będzie po prostu odwołaniem do tego samego obiektu, któryjQuery.prototype
już się odwołuje.Aby to potwierdzić, możesz sprawdzić,
jQuery.fn === jQuery.prototype
czy to oceniatrue
(co robi), a następnie odwołują się do tego samego obiektuźródło