Chức năng jQuery.fn.init
là chức năng được thực hiện khi bạn gọi jQuery(".some-selector")
hoặc $(".some-selector")
. Bạn có thể thấy điều này trong đoạn này từ jquery.js:
jQuery = window.jQuery = window.$ = function(selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init(selector, context);
}
Vì vậy, trên thực tế, dòng bạn đề cập là rất quan trọng để làm sao jQuery cho phép việc bổ sung chức năng cho đối tượng jQuery, cả bên trong jQuery riêng của mình và từ plugins. Đây là dòng:
jQuery.fn.init.prototype = jQuery.fn;
Bằng cách chỉ định jQuery.fn
như nguyên mẫu của hàm này (và vì đoạn đầu tiên sử dụng 'mới' để điều trị jQuery.fn.init như một constructor), điều này có nghĩa là chức năng bổ sung qua jQuery.fn.whatever
ngay lập tức có sẵn trên các đối tượng được trả về bởi tất cả các cuộc gọi jQuery.
Vì vậy, ví dụ, một plugin jQuery đơn giản có thể được tạo ra và sử dụng như thế này:
jQuery.fn.foo = function() { alert("foo!"); };
jQuery(".some-selector").foo();
Khi bạn khai báo 'jQuery.fn.foo' trên dòng đầu tiên những gì bạn đang thực sự làm được thêm rằng chức năng cho nguyên mẫu của tất cả các đối tượng jQuery được tạo bằng hàm jQuery như hàm trên dòng thứ hai. Điều này cho phép bạn gọi đơn giản 'foo()' trên các kết quả của hàm jQuery và gọi các hàm plugin của bạn.
Tóm lại, việc viết các plugin jQuery sẽ tiết kiệm hơn và bị vỡ trong tương lai nếu chi tiết triển khai thay đổi nếu dòng này không tồn tại trong jQuery.
Nguồn
2009-11-18 11:06:33
Tôi không chắc chắn ý bạn là gì bằng cách thêm f1() vào init.prototype? Nó không thêm "vào" bất cứ điều gì, nó chỉ định nguyên mẫu. –
Chắc chắn. Tôi có nghĩa là "gán" tất nhiên. Xin lỗi vì tiếng Anh của tôi.Và câu hỏi đặt ra là tại sao không chỉ đơn giản gán tất cả hàm cho init.prototype? Tại sao chúng được gán cho jQuery.prototype và jQuery.prototype được gán cho câu hỏi liên quan đến jQuery.prototype.init.prototype – NilColor
về mẫu thiết kế của jQuery: http://stackoverflow.com/q/12143590/1048572 – Bergi