JQuery.fn có nghĩa là gì?


568

Không những gì fnở đây nghĩa là gì?

jQuery.fn.jquery

Câu trả lời:


848

Trong jQuery, thuộc fntính chỉ là bí danh của thuộc prototypetính.

jQueryđịnh danh (hoặc $) chỉ là một hàm tạo và tất cả các thể hiện được tạo bằng nó, kế thừa từ nguyên mẫu của hàm tạo.

Hàm xây dựng đơn giản:

function Test() {
  this.a = 'a';
}
Test.prototype.b = 'b';

var test = new Test(); 
test.a; // "a", own property
test.b; // "b", inherited property

Một cấu trúc đơn giản giống với kiến ​​trúc của 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"

4
Điều này có được đảm bảo là đúng không? Tôi có thể giả sử một lệnh gọi tới jQuery.prototype giống hệt như jQuery.fn không? Lo lắng của tôi là nếu jQuery thực hiện một số phép thuật khi bạn gọi .fn thì chúng không thể hoán đổi cho nhau
Brandon

4
Ồ, tôi đang thiếu thứ gì đó .. 'window.foo = foo' mang lại cho 'foo' một phạm vi toàn cầu? không bao giờ mới, tôi sẽ thêm nó vào danh sách các kỹ thuật cần học.
EE33

2
@ EE33 Nếu tôi không nhầm, phạm vi toàn cầu trong javascript chỉ có nghĩa là biến của bạn là một tham số của đối tượng cửa sổ.
Shawn

1
@Imray - return thisđể cho phép xích , vì vậy bạn có thể làmfoo("bar").myPlugin().otherPlugin()
Racing Tadpole

3
@Shawn Tôi nghĩ rằng nó sẽ được gọi là một tài sản, không phải là một tham số, phải không? Tham số sẽ là biến 'a' ở đây function func1 (a) { ... }và thuộc tính sẽ là biến 'a' ở đây var foo = {}; foo.a = 'a'.
Zack

145

jQuery.fnđược định nghĩa tốc ký cho jQuery.prototype. Từ mã nguồn :

jQuery.fn = jQuery.prototype = {
    // ...
}

Điều đó có nghĩa jQuery.fn.jquerylà một bí danh cho jQuery.prototype.jquery, trả về phiên bản jQuery hiện tại. Một lần nữa từ mã nguồn :

// The current version of jQuery being used
jquery: "@VERSION",

15
Tôi thích câu trả lời này. Tôi chỉ ra chính xác cách tìm định nghĩa bên trong mã nguồn và sau đó là cách diễn giải định nghĩa theo cách hữu ích. Phương pháp trả lời "dạy một người đàn ông câu cá" tốt. +1.
EE33

nhưng mục đích của việc đó là gì? chỉ tiết kiệm vài lần gõ phím?
slier

@smore: vâng, khá nhiều.
Andy E

Tôi cá là còn có mục đích khác..chuyển đổi chức năng thành $ .fn, sẽ tạo chức năng tĩnh
slier

145

fnnghĩa đen là nói đến jquery prototype.

Dòng mã này nằm trong mã nguồn:

jQuery.fn = jQuery.prototype = {
 //list of functions available to the jQuery api
}

Nhưng công cụ thực sự đằng sau fnlà tính khả dụng của nó để nối chức năng của riêng bạn vào jQuery. Hãy nhớ rằng jquery sẽ là phạm vi cha mẹ cho hàm của bạn, vì vậy thissẽ tham chiếu đến đối tượng jquery.

$.fn.myExtension = function(){
 var currentjQueryObject = this;
 //work with currentObject
 return this;//you can include this if you would like to support chaining
};

Vì vậy, đây là một ví dụ đơn giản về điều đó. Hãy nói rằng tôi muốn tạo hai phần mở rộng, một phần mở ra một viền màu xanh lam và màu nào cho màu xanh của văn bản và tôi muốn chúng được xâu chuỗi.

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;
};

Bây giờ bạn có thể sử dụng những người chống lại một lớp như thế này:

$('.blue').blueBorder().blueText();

(Tôi biết điều này được thực hiện tốt nhất với css như áp dụng các tên lớp khác nhau, nhưng xin lưu ý đây chỉ là bản demo để hiển thị khái niệm)

Câu trả lời này có một ví dụ tốt về một phần mở rộng đầy đủ.


11
Bạn có thể bỏ qua eachmã ví dụ của bạn không? $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };sẽ hoạt động tốt, như .css()lặp đi lặp lại trên các yếu tố.
SoonDead

6
@SoonDead - Bạn chắc chắn có thể bởi vì nếu đối tượng jQuery giữ một bộ sưu tập thì csshàm sẽ tự động lặp lại bên trong chúng với nhau. Nó chỉ là một ví dụ cho thấy sự khác biệt trong thisđó đối tượng bên ngoài là đối tượng jquery và đối tượng bên trong tham chiếu chính phần tử đó.
Travis J

1
@SoonDead Nhận xét tốt, nhưng tôi thực sự thích cách Travis J giải thích ý tưởng / nguyên tắc. :)
Sander

5
Đây là nhận xét tốt nhất - Biết rằng fn chỉ là một bí danh gần như không hữu ích bằng việc biết tại sao mọi người nên quan tâm, và câu trả lời này đã chứng minh điều đó rất hay.
Gerard ONeill

1
Sau khi đi qua các câu trả lời khác, tôi thấy câu này dễ hiểu hơn về khái niệm chính. Cảm ơn bạn. :)
VivekP

0

Trong mã nguồn jQuery chúng tôi có jQuery.fn = jQuery.prototype = {...}kể từ khi jQuery.prototypelà một đối tượng giá trị của jQuery.fnchỉ đơn giản sẽ là một tham chiếu đến cùng một đối tượng mà jQuery.prototypeđã tham khảo.

Để xác nhận điều này, bạn có thể kiểm tra jQuery.fn === jQuery.prototypenếu đánh giá true(mà nó làm) thì họ tham chiếu cùng một đối tượng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.