jQuery.fn หมายถึงอะไร


คำตอบ:


848

ใน jQuery fnคุณสมบัติเป็นเพียงนามแฝงของprototypeคุณสมบัติ

jQueryระบุ (หรือ$) เป็นเพียงฟังก์ชั่นคอนสตรัคและอินสแตนซ์ทั้งหมดที่สร้างขึ้นกับมันสืบทอดมาจากต้นแบบคอนสตรัคของ

ฟังก์ชันตัวสร้างแบบง่าย:

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

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

โครงสร้างอย่างง่ายที่คล้ายกับสถาปัตยกรรมของ 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
สิ่งนี้รับประกันได้ว่าเป็นจริงหรือไม่? ฉันสามารถถือว่า jQuery.prototype นั้นเหมือนกับ jQuery.fn ได้หรือไม่? ความกังวลของฉันคือถ้า jQuery ใช้เวทมนตร์เมื่อคุณโทรหา. fn ดังนั้นพวกเขาจึงไม่สามารถแลกเปลี่ยนกันได้
Brandon

4
โอ้ฉันคิดถึงบางสิ่ง .. 'window.foo = foo' ให้ขอบเขตทั่วโลกกับ 'foo' หรือไม่ ไม่เคยใหม่เลยฉันจะเพิ่มเข้าไปในรายการเทคนิคเพื่อเรียนรู้
EE33

2
@ EE33 หากฉันไม่เข้าใจผิดขอบเขตทั่วโลกใน javascript นั้นหมายความว่าตัวแปรของคุณเป็นพารามิเตอร์ของวัตถุหน้าต่าง
Shawn

1
@Imray - return thisอนุญาตให้ผูกมัดดังนั้นคุณสามารถทำได้foo("bar").myPlugin().otherPlugin()
Racing Tadpole

3
@Shawn ฉันคิดว่ามันจะเรียกว่าเป็นทรัพย์สินไม่ใช่พารามิเตอร์ใช่มั้ย พารามิเตอร์จะเป็น 'a' ตัวแปรที่นี่function func1 (a) { ... }และสถานที่ให้บริการจะเป็น 'a' var foo = {}; foo.a = 'a'ตัวแปรที่นี่
แซค

145

jQuery.fnjQuery.prototypeถูกกำหนดชวเลข จากซอร์สโค้ด :

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

นั่นหมายถึงjQuery.fn.jqueryนามแฝงสำหรับjQuery.prototype.jqueryซึ่งส่งคืนเวอร์ชัน jQuery ปัจจุบัน อีกครั้งจากซอร์สโค้ด :

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

15
ฉันชอบคำตอบนี้ ฉันแสดงวิธีค้นหาคำจำกัดความภายในซอร์สโค้ดอย่างชัดเจนแล้วจะตีความคำนิยามในลักษณะที่มีประโยชน์อย่างไร วิธีการที่ดีสอนวิธีการตอบคน +1
EE33

แต่วัตถุประสงค์ของการทำเช่นนั้นคืออะไร? บันทึกแค่การกดแป้นสองครั้ง?
slier

@ ก่อนหน้านี้: ใช่สวยมาก
Andy E

ฉันพนันว่ามีวัตถุประสงค์อื่น .. การแนบฟังก์ชั่นเป็น $ .fn จะทำให้ฟังก์ชั่นคงที่
slier

145

fnหมายถึง jquery prototypeอย่างแท้จริง

บรรทัดของโค้ดนี้อยู่ในซอร์สโค้ด:

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

แต่เครื่องมือจริงที่อยู่เบื้องหลังfnคือความพร้อมในการเชื่อมโยงการทำงานของคุณเข้ากับ jQuery โปรดจำไว้ว่า jquery จะเป็นขอบเขตหลักของฟังก์ชันของคุณดังนั้นthisจะอ้างถึงวัตถุ jquery

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

นี่คือตัวอย่างง่ายๆของสิ่งนั้น ให้บอกว่าฉันต้องการที่จะทำให้สองส่วนขยายหนึ่งซึ่งทำให้เส้นขอบสีฟ้าและที่สีข้อความสีฟ้าและฉันต้องการให้พวกเขาถูกล่ามโซ่

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

ตอนนี้คุณสามารถใช้คลาสเหล่านี้กับคลาสนี้ได้:

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

(ฉันรู้ว่าสิ่งนี้ทำได้ดีที่สุดกับ css เช่นการใช้ชื่อคลาสที่ต่างกัน แต่โปรดจำไว้ว่านี่เป็นเพียงตัวอย่างเพื่อแสดงแนวคิด)

คำตอบนี้มีตัวอย่างที่ดีของส่วนขยายแบบเต็ม


11
คุณไม่สามารถข้ามeachรหัสตัวอย่างของคุณหรือไม่ $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };จะทำงานได้ดีเนื่องจากมีการ.css()วนซ้ำในองค์ประกอบ
SoonDead

6
@SoonDead - คุณสามารถทำได้อย่างแน่นอนเพราะถ้าวัตถุ jQuery เก็บสะสมแล้วcssฟังก์ชั่นจะทำซ้ำพวกเขาโดยอัตโนมัติภายในแต่ละ มันเป็นเพียงตัวอย่างของการแสดงความแตกต่างthisที่ซึ่งวัตถุด้านนอกเป็นวัตถุ jquery และหนึ่งภายในอ้างอิงองค์ประกอบของตัวเอง
Travis J

1
@ SunDead ความคิดเห็นดี แต่ฉันชอบวิธีที่เทรวิสเจอธิบายความคิด / หลักการ :)
Sander

5
นี่คือความคิดเห็นที่ดีที่สุด - การรู้ว่า fn เป็นเพียงนามแฝงไม่ได้มีประโยชน์เกือบเท่ากับการรู้ว่าทำไมทุกคนควรใส่ใจและคำตอบนี้แสดงให้เห็นอย่างสวยงาม
เจอราร์ดโอนีล

1
หลังจากผ่านคำตอบอื่น ๆ ฉันพบว่าสิ่งนี้ง่ายต่อการเข้าใจแนวคิดหลัก ขอบคุณ. :)
VivekP

0

ในซอร์สโค้ด jQuery เรามีjQuery.fn = jQuery.prototype = {...}ตั้งแต่jQuery.prototypeเป็นวัตถุค่าของjQuery.fnจะเป็นการอ้างอิงไปยังวัตถุเดียวกันที่jQuery.prototypeอ้างอิงแล้ว

เพื่อยืนยันสิ่งนี้คุณสามารถตรวจสอบjQuery.fn === jQuery.prototypeว่าประเมินtrue(ซึ่งมัน) แล้วพวกเขาอ้างอิงวัตถุเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.