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과 정확히 동일하다고 가정 할 수 있습니까? 내 걱정은 .fn을 호출 할 때 jQuery가 마술을 수행하면 서로 호환되지 않는다는 것입니다.
Brandon

4
아, 뭔가 빠졌습니다. 'window.foo = foo'는 'foo'에 전역 범위를 부여합니까? 결코 새로운 것이 아닙니다. 저는 그것을 배울 기술 목록에 추가하겠습니다.
EE33

2
@ EE33 내가 실수하지 않으면 자바 스크립트의 전역 범위는 단순히 변수가 창 객체의 매개 변수임을 의미합니다.
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.fn의 약칭으로 정의됩니다 jQuery.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

@ slier : 그렇습니다.
Andy E

내가 정적 기능을 할 것입니다, $ .fn 다른 purpose..attaching 기능이 내기
slier

144

fn말 그대로 jquery를 참조하십시오 prototype.

이 코드 줄은 소스 코드에 있습니다.

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

그러나 실제 도구 뒤에는 fn고유 한 기능을 jQuery에 연결하는 기능이 있습니다. jquery는 함수의 부모 범위이므로 thisjquery 객체를 참조하십시오.

$.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예제 코드에서를 건너 뛸 수 없습니까 ? alerady가 요소를 반복 $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };하므로 잘 작동합니다 .css().
SodeDead

6
@SoonDead-jQuery 객체가 컬렉션을 보유하면 css함수가 각각 내부적으로 자동으로 반복 하기 때문에 확실히 할 수 있습니다. this외부 객체가 jquery 객체이고 내부 객체가 요소 자체를 참조하는 경우 의 차이점을 보여주는 예제 일뿐 입니다.
트래비스 J

1
@SoonDead 좋은 의견이지만 Travis J가 아이디어 / 원칙을 어떻게 설명했는지 정말 좋아합니다. :)
Sander

5
이것이 가장 좋은 의견입니다.-fn이 별칭이라는 것을 아는 것은 다른 사람이 관심을 가져야하는 이유를 아는 것만 큼 유용하지는 않습니다.
Gerard ONeill

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.