2011-01-21 22 views
39

Tôi đã xem qua jQuery để hiểu rõ hơn cách hoạt động của jQuery. Phương thức khởi tạo về cơ bản chỉ gọi sốTrợ giúp hiểu jQuery của jQuery.fn.init Tại sao init trong fn

new jQuery.fn.init 

Tôi tự hỏi điểm của init trong nguyên mẫu jQuery là gì? Sẽ không xác định init() như là một phần của đối tượng jQuery chính nó phục vụ cùng một mục đích?


Về cơ bản tôi muốn biết tại sao hàm init của jQuery tọa lạc tại jQuery.fn.init() và không jQuery.init()

Có người làm điều này:

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

Trả lời

47

EDIT: Sau khi đọc lại tôi không nghĩ rằng điều này trả lời câu hỏi của bạn, nhưng nó có thể hữu ích cho sự hiểu biết tốt hơn của một ai đó về cách jQuery hoạt động anyway vì vậy tôi rời khỏi nó.


gì đang xảy ra là jQuery() đang được định nghĩa là jQuery.fn.init() đó là một cách khác để nói jQuery.prototype.init() đó là chức năng chọn! Điều này có nghĩa là không ai gọi số jQuery.fn.init() hoặc jQuery.init()jQuery() IS .init()!

Cái gì?

Hãy nhìn vào đoạn mã bạn đang nói về:

// 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); 
    }, 

Trong những ý kiến ​​nó nói chỉ là những gì tôi đã nói, nhưng một thời gian ngắn hơn. Nhưng đây chỉ là bản sao cục bộ của jQuery ... tuy nhiên, nếu bạn đi đến dòng 908 (của phiên bản 1.4.4) ở cuối chức năng tự thực hiện, bạn sẽ thấy:

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

})(); 

.. có nghĩa là địa phương này jQuery trở thành toàn cầu jQuery. Vì thế? Vì vậy ... địa phương này jQuery thực sự là jQuery.fn.init() phải không? Vì vậy, init() là gì? Nếu bạn nhìn từ dòng 100 đến 208 bạn sẽ thấy rằng đó là phương pháp chọn. Phương pháp chọn là gì? Đó là phương pháp bạn sử dụng mọi lúc để tìm các thẻ, id, các lớp ... $('#id'), jQuery('.class'), $('ul li a') ... chức năng chọn!

Vì vậy, không ai có thể gọi jQuery.init('div') vì đây là phiên bản tiết kiệm của jQuery('div') sau lần gán đó. Và hãy nhớ rằng jQuery.fn chính xác giống như khi nói jQuery.prototype vì vậy thực sự tất cả những gì một phần đang làm là gán .init() làm phương thức của nguyên mẫu của đối tượng jQuery. I E. một plugin jQuery.

Phew, đó là một ngụm. Tôi hy vọng điều này có ý nghĩa và nếu có ai sửa đổi trong trường hợp tôi hiểu sai trong bất kỳ phần nào của lời giải thích dài dòng này, vui lòng cho tôi biết.

+4

+1 cho nỗ lực tuyệt đối. Vì vậy, có bất kỳ lý do cụ thể để sử dụng nguyên mẫu như ** đối lập ** để chỉ trên đối tượng jQuery chính nó. Là nó nhanh hơn hoặc một cái gì đó như thế (tôi không thể tưởng tượng rằng nó là) –

+1

Tôi không có một câu trả lời tốt cho câu hỏi đó, xin lỗi. Tôi có thể hack một câu trả lời, nhưng chắc chắn về điều này là trên mức lương của tôi. – mVChr

+1

ditto +1. không bao giờ thực sự hiểu những gì mà bit đầu tiên cho jquery đã làm. cảm ơn, mvchr! – hellatan

7

$() là một instanceof (new $()) là một instanceof (new $.fn.init())

Kỹ thuật được sử dụng bởi jQuery là cách bạn có thể đạt được điều này. $() luôn trả về như được gọi với từ khóa new.Tuy nhiên, thay vì sử dụng công tắc có điều kiện trên tham chiếu this bên trong function jQuery() {...}, nó sử dụng đối tượng đại biểu bên ngoài trong mọi trường hợp. Đối tượng đại biểu bên ngoài này, jQuery.fn.init() {...}, được cung cấp nguyên mẫu jQuery sao cho đối tượng 'kiểu' của nó là jQuery và tất cả các phiên bản của nó thực sự là các cá thể của jQuery.

+0

Trong câu trả lời được cung cấp bởi @mVchr, câu trả lời này rất ấn tượng. Nó cung cấp một định nghĩa bằng lời về những gì nếu không sẽ là một đoạn mã abstruse mà sẽ xuất hiện để cung cấp chỉ mơ hồ. Cảm ơn rất nhiều! Nhưng tôi vẫn muốn bạn đã đi xa hơn một hai dặm. Điều này chắc chắn có giá trị ít nhất một chương trong một cuốn sách. –

Các vấn đề liên quan