(177-240)
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target;
// skip the boolean and the target
target = arguments[ i ] || {};
i++;
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// extend jQuery itself if only one argument is passed
if ( i === length ) {
target = this;
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
if ( target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];
console.log(clone)
} else {
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
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;
};
//
console.log(jQuery.extend({b:2},{d:3},{b:3,c:1}))
//
console.log(jQuery.extend([1,[1,3]],[1,[1,2]]))
//
console.log(jQuery.extend(true,{a:1,b:{c:1}},{b:[2]},{c:1}))
// 1
jQuery.extend({a:1})
console.log(jQuery.a)
extend 방법의 기능 요구사항:
~ 여러 객체를 첫 번째 객체로 결합
반복 병합 모드
~ 매개 변수가 1개일 때,this가 가리키는 대상(호출자, jQuery 또는 jQuery.fn)을 확장합니다
~ 병합 배열
실제 기능의 요구는 매우 간단하다. 바로 매개 변수를 반복해서 대상을 첫 번째 대상으로 통합하는 것이다.다른 저자들이 고려하는 문제는 대상과 숫자가 동시에 나타나고 매개 변수는 문자열이며 버그 호환 처리가 있습니다.
jQuery뿐만 아니라 모든 원본 코드에 대해 개발팀은 가능한 한 많은 상황을 해결한다.모두 알다시피 먼저 문제가 있어야만 해결 방법이 있다.만약 우리가 어떻게 된 일인지 모르는 문제가 있다면, 우리가 해결 방법을 읽어도 영문을 알 수 없다.
이것은 너무 얽매일 필요가 없다. 앞으로 같은 문제에 부딪히면 자연히 같은 코드를 쓸 것이다.
다음은 귀속만 하는 확장 함수로 원리는 목표 속성이 대상인지 아닌지, 귀속되는지, 아니면 직접 합병되는지 판단하는 것이다.
function extend(){
var target = arguments[0];
var options = arguments[i];
for( var i = 1;i<arguments.length;i++){
for(var name in (options = arguments[i])){
var src = target[name]
var copy = options[name]
// ,
if(jQuery.isPlainObject(copy)){
var clone = jQuery.isPlainObject(src) ? src : {};
extend(clone,copy)
}else{
//
target[name] = arguments[i][name];
}
}
}
return target;
}
console.log(extend({a:{b:1}},{a:{c:2}}))
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.