jQuery 소스 코드 분석 - 2 코드 전체 구조 와 핵심 방법
7407 단어 jquery
jQuery 변수 와 확장 방법 을 제거 하고 다음 간소화 코드 를 살 펴 보 세 요.
(function( window, undefined ) {
// jQuery
var jQuery = (function() {
//
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
};
// jQuery prototype jQuery.fn
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
/**
* selector 7 :
DOM
body( )
:HTML 、HTML 、#id、
( ready )
*/
init: function( selector, context, rootjQuery ) {
//
}
};
// Give the init function the jQuery prototype for later instantiation
// jQuery.fn jQuery.fn.init.prototype, init prototype jQuery.fn
jQuery.fn.init.prototype = jQuery.fn;
//jQuery
jQuery.extend = jQuery.fn.extend = function() {
};
// jQuery
jQuery.extend({
// ready bindReady
// isPlainObject isEmptyObject
// parseJSON parseXML
// globalEval
// each makeArray inArray merge grep map
// proxy
// access
// uaMatch
// sub
// browser
});
// ,jQuery , jQuery jQuery
return jQuery;
})();
// Expose jQuery to the global object
// jQuery $ window
window.jQuery = window.$ = jQuery;
})( window );
다음 분석 프레임 워 크 의 코드
1、
jQuery 대상 은 통과 가 아 닙 니 다. new jQuery 만 든 것 이 아니 라 new jQuery.fn.init 창설했어
var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); }
jQuery 대상 은 jQuery. fn. init 대상 입 니 다.new jQeury () 를 실행 하면 실제 패키지 에서 new jQuery. fn. init 를 실행 하고 마지막 으로 돌아 갑 니 다. jQuery. fn. init 대상;코드 통과
window.jQuery = window.$ = jQuery;
jQuery 와 $window 전역 변 수 를 위 한 jQuery 는 함수 대상 이 므 로 jQuery (selector, context) 를 직접 호출 할 수 있 습 니 다.jQuery 대상 (함수) 을 되 돌려 줍 니 다.여기 서 참고 로 window 대상 에 게 속성 이나 방법 을 추가 하 는 것 은 실제 적 으로 전체 적 인 것 이 므 로 직접 방문 할 수 있 습 니 다. 예 를 들 어 다음 과 같은 코드 입 니 다.
window. method 1 = function () {console. info ('전역 방법')};window.method1();//전역 방법 method 1 (); /전역 적 방법
2、
코드 에서 먼저 실행 jQuery. fn = jQuery. prototype, 재 실행 jQuery. fn. init. prototype = jQuery. fn, 합 친 코드 는 다음 과 같 습 니 다.
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
jQuery. fn 에 마 운 트 하 는 모든 방법 은 jQuery. prototype, 즉 jQuery 에 마 운 트 하 는 것 과 같 습 니 다. 함수 상 (처음 jQuery = function( selector, context ) ),하지만 결국 마 운 트 된 셈 이다. jQuery. fn. init. prototype, 즉 처음 jQuery 에 마 운 트 된 것 과 같 습 니 다. 함수 가 돌아 오 는 대상, 즉 우리 가 최종 적 으로 사용 하 는 jQuery 대상 에 마 운 트 되 었 습 니 다.
3、jQuery.fn.init
jQuery. fn. init 의 기능 은 들 어 오 는 selector 매개 변 수 를 분석 하고 다양한 처 리 를 한 다음 에 jQuery 대상 을 생 성 하 는 것 이다.
유형 (selector)
처리 방식
DOM 요소
jQuery 대상 으로 포장 하고 바로 돌아 가기
body (최적화)
document. body 에서 읽 기
단독 HTML 태그
document.createElement
HTML 문자열
document.createDocumentFragment
#id
document.getElementById
선택 기 표현 식
$(…).find
함수.
dom ready 에 등 록 된 리 셋 함수
4、jQuery.extend = jQuery.fn.extend
//jQuery
/**
* ,jQuery
jQuery.fn.extend , jQuery.extend
, target
, jQuery 。
, jQuery 。 jQuery 。
, :$.extend({}, object1, object2);
, target ,
true,
object
undefined
,JavaScript
:
jQuery.extend( target, [ object1 ], [ objectN ] )
jQuery.extend( [ deep ], target, object1, [ objectN ] )
*/
jQuery.extend = jQuery.fn.extend = function() {
var options, //
name, //
src, //
copy, // copy
copyIsArray, //copy
clone,// copy ,
target = arguments[0] || {},// copy
i = 1,
length = arguments.length,
deep = false;// copy
// Handle a deep copy situation
// , copy
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
// boolean target, 3
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
// target ,
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// extend jQuery itself if only one argument is passed
// , jQuery
if ( length === i ) {
target = this;
--i;// i
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
//
if ( (options = arguments[ i ]) != null ) {
// Extend the base object
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loop
// , target copy
if ( target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
// (json ) ,
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {//
copyIsArray = false;
// , && ,
//1、src null undefined ,clone []
//2、src , src clone
//3、src , clone []
// clone , target[ name ] ,copy
clone = src && jQuery.isArray(src) ? src : [];
} else {
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
// , copy
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery 에서 extend 방법 에 대한 구체 적 인 분석 은 코드 의 주석 을 참조 합 니 다. 코드 에서 보 듯 이 jQuery 의 extend 는 대상 간 의 copy 기능 을 실현 하고 ext 중의 apply 방법 과 같 습 니 다. ext 중의 apply 보다 훨씬 강 합 니 다. ext 중의 extend 방법 은 대상 을 대상 으로 하 는 클래스 계승 과 같 습 니 다. 주로 function 에 대해 계승 을 실 현 했 습 니 다. 속성 과 방법의 계승 을 포함 하여 가능 합 니 다.재 구성 도 계승 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
jQuery 전후 예이 기사에서는 jquery after() 및 before() 메소드의 예를 볼 것입니다. before() 메서드는 선택한 요소 앞에 지정된 콘텐츠를 삽입합니다. after() 메서드는 선택한 요소 뒤에 지정된 콘텐츠...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.