2011-01-21 8 views
39

Przeglądałem jQuery, aby lepiej zrozumieć, jak to działa. Konstruktor w zasadzie po prostu wywołujePomoc w zrozumieniu jQuery.fn.init Dlaczego jest init in fn

new jQuery.fn.init 

Zastanawiam się, jaki jest sens posiadania init w prototypie jQuery? Czy nie zdefiniowałoby się jako części samego obiektu jQuery tego samego celu?


Zasadniczo chciałbym wiedzieć, dlaczego funkcji init jQuery znajduje się jQuery.fn.init() i nie jQuery.init()

Są tam ludzie robią to:

jQuery('a').eq(0).hide().init('div').slideToggle(); //? 

Odpowiedz

47

EDIT: po ponownym przeczytaniu I nie sądzę, że to odpowiada na twoje pytanie, ale może to być przydatne dla kogoś, kto lepiej zrozumie, jak działa jQuery, więc opuszczam go.


Co się dzieje jest to, że jQuery() jest zdefiniowany jako jQuery.fn.init() co jest kolejnym sposobem, aby powiedzieć jQuery.prototype.init() która jest funkcją selektor! Oznacza to, że nikt nie zadzwoni pod numer jQuery.fn.init() lub jQuery.init(), ponieważ jQuery() IS .init()!

Co? wygląd

Miejmy na kawałek kodu mówisz:

// Define a local copy of jQuery 
var jQuery = function(selector, context) { 
     // The jQuery object is actually just the init constructor 'enhanced' 
     return new jQuery.fn.init(selector, context); 
    }, 

w komentarzach mówi tylko to, co powiedziałem, ale krótko. Ale to tylko lokalna kopia jQuery ... jednak, jeśli pójdziesz do linii 908 (w wersji 1.4.4) na końcu funkcji samodzielnego wykonywania zobaczysz:

// Expose jQuery to the global object 
return (window.jQuery = window.$ = jQuery); 

})(); 

.. co oznacza, że ​​ten lokalny jQuery staje się globalnym jQuery. Więc? Więc ... ten lokalny jQuery był rzeczywiście jQuery.fn.init() prawda? Więc co to jest init()? Jeśli spojrzysz z linii od 100 do 208, zobaczysz, że jest to metoda selektora. Jaka jest metoda selektora? Jest to metoda, której używasz przez cały czas, aby znaleźć tagi, identyfikatory, klasy ... $('#id'), jQuery('.class'), $('ul li a') ... funkcja selektora!

Nikt nigdy nie zadzwoniłby pod numer jQuery.init('div'), ponieważ jest to pełna wersja jQuery('div') po tym przypisaniu. I pamiętaj, że jQuery.fn jest dokładnie tym samym, co powiedzenie jQuery.prototype, więc tak naprawdę cała ta część robi tylko przypisanie .init() jako metody prototypu obiektu jQuery. TO ZNACZY. wtyczka jQuery.

Uff, to był kęs. Mam nadzieję, że to ma sens, a jeśli ktoś ma jakieś poprawki na wypadek, gdybym źle poinformował w jakiejkolwiek części tego długiego wyjaśnienia, proszę dać mi znać.

+4

+1 za zwykły wysiłek. Czy istnieje jakiś szczególny powód, aby użyć prototypu jako ** przeciwnego ** do samego obiektu jQuery. Czy jest szybszy, czy coś w tym stylu (nie mogę sobie tego wyobrazić) –

+1

Nie mam dobrej odpowiedzi na to pytanie, przepraszam. Mogę włamać się do odpowiedzi, ale pewność na tym jest powyżej mojej oceny płac. – mVChr

+1

ditto +1. nigdy naprawdę nie rozumiał, co robi ten pierwszy kawałek jquery. dzięki, mvchr! – hellatan

7

$() jest instancją (new $()) jest instancją (new $.fn.init())

Technika zatrudniony przez jQuery to w jaki sposób można to osiągnąć. $() zawsze zwraca tak, jakby został wywołany ze słowem kluczowym new.Jednak zamiast używać warunkowego przełącznika w obiekcie this wewnątrz function jQuery() {...}, korzysta on z zewnętrznego obiektu delegowanego we wszystkich przypadkach. Ten zewnętrzny obiekt delegowany, jQuery.fn.init() {...}, otrzymuje prototyp jQuery, więc jego obiekt "type" ma numer jQuery, a wszystkie jego wystąpienia są w rzeczywistości instancjami jQuery.

+0

W świetle odpowiedzi udzielonej przez @mVchr ta odpowiedź jest imponująca. Zapewnia słowną definicję czegoś, co w przeciwnym razie byłoby zawiłym fragmentem kodu, który wydaje się zapewniać jedynie niejednoznaczność. Dziękuję bardzo! Ale nadal żałuję, że nie przejechałeś jeszcze milę lub dwie. Jest to zdecydowanie warte przynajmniej jednego rozdziału w książce. –

Powiązane problemy