JQuery.fn anlamı ne?


Yanıtlar:


848

JQuery'de, fnözellik yalnızca mülkün diğer adıdır prototype.

jQueryTanımlayıcı (veya $) sadece bir yapıcı işlevi ve şantiye prototip devralan onunla oluşturulan tüm örneklerdir.

Basit bir yapıcı işlevi:

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

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

JQuery mimarisine benzeyen basit bir yapı:

(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
Bunun doğru olacağı garanti ediliyor mu? JQuery.prototype çağrısının jQuery.fn ile tam olarak aynı olduğunu varsayabilir miyim? Benim endişem jfuery .fn çağırdığınızda biraz sihir yaparsa o zaman değiştirilebilir değildir
Brandon

4
Oh, bir şeyleri özlüyorum .. 'window.foo = foo' 'foo' 'küresel bir kapsam veriyor mu? yeni olmamışsa, bunu öğrenmek için teknikler listeme ekleyeceğim.
EE33

2
@ EE33 Yanılmıyorsam, javascript'teki global kapsam, değişkeninizin pencere nesnesinin bir parametresi olduğu anlamına gelir.
Shawn

1
@Imray - zincirlemeyereturn this izin vermek için yapabilirsinfoo("bar").myPlugin().otherPlugin()
Racing Tadpole

3
@Shawn Bence bir parametre değil bir özellik denir, değil mi? Parametre burada 'a' değişkeni function func1 (a) { ... }ve bir özellik de burada 'a' değişkeni olacaktır var foo = {}; foo.a = 'a'.
Zack

145

jQuery.fniçin kısayol tanımlanmıştır jQuery.prototype. Gönderen kaynak kodu :

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

Bu , geçerli jQuery sürümünü döndüren jQuery.fn.jquerybir diğer jQuery.prototype.jqueryaddır. Yine kaynak koddan :

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

15
Bu cevabı beğendim. Kaynak kodun içindeki tanımın tam olarak nasıl bulunacağını ve daha sonra tanımın yararlı bir şekilde nasıl yorumlanacağını gösteririm. İyi ol '' bir insana balık tutmayı öğret '' yanıtlama yöntemi. +1.
EE33

ama bunu yapmanın amacı nedir? sadece birkaç tuşa basarak mı tasarruf edersiniz?
slier

@slier: evet, hemen hemen.
Andy E

i başka bir amaç var bahse girerim ... $ .fn işlevini takma, statik işlev yapacak
slier

145

fnkelimenin tam anlamıyla jquery anlamına gelir prototype.

Bu kod satırı kaynak kodundadır:

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

Ancak arkasındaki gerçek araç fn, kendi işlevselliğinizi jQuery'ye bağlamak için kullanılabilirliğidir. Jquery'nin işlevinizin üst kapsamı olacağını unutmayın, bu nedenle thisjquery nesnesine atıfta bulunun.

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

İşte bunun basit bir örneği. Biri mavi bir kenarlık yerleştiren ve metni mavi renklendiren iki uzantı yapmak istediğimi ve bunların zincirlenmesini istiyorum.

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

Şimdi bunları böyle bir sınıfa karşı kullanabilirsiniz:

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

(Bunun en iyi farklı sınıf isimleri uygulamak gibi css ile yapıldığını biliyorum, ancak lütfen bunun sadece konsepti göstermek için bir demo olduğunu unutmayın)

Bu cevabın tam teşekküllü bir uzantıya iyi bir örneği var.


11
eachÖrnek kodunuzda atlayamaz mısınız? Alerady elementler üzerinde tekrarladığı için $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };iyi çalışır .css().
SoonDead

6
@SoonDead - Kesinlikle yapabilirsiniz çünkü jQuery nesnesi bir koleksiyona sahipse, cssişlev otomatik olarak her biri ile dahili olarak yinelenir . Bu sadece thisdış nesnenin jquery nesnesi ve iç nesnenin elemanın kendisine referans gösterdiği farkları göstermenin bir örneğiydi .
Travis J,

1
@SoonDead İyi yorum, ancak Travis J'nin fikri / ilkeyi nasıl açıkladığını çok seviyorum. :)
Sander

5
Bu en iyi yorum - fn'nin sadece bir takma ad olduğunu bilmek, herkesin neden umursaması gerektiğini bilmek kadar kullanışlı değil ve bu cevap bunu güzel bir şekilde gösterdi.
Gerard ONeill

1
Diğer cevapları inceledikten sonra, bunun ana konsepti daha kolay anladığını gördüm. Teşekkür ederim. :)
VivekP

0

Elimizdeki jQuery kaynak kodunda jQuery.fn = jQuery.prototype = {...}beri jQuery.prototypebir nesne değeri jQuery.fnbasitçe aynı nesneye bir referans olacaktır jQuery.prototypezaten referanslar.

Bunu onaylamak için jQuery.fn === jQuery.prototypebunun değerlendirip değerlendirmediğini true(hangisinin yaptığı) kontrol edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.