(177-240)

8061 단어
extend 방법
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}}))

좋은 웹페이지 즐겨찾기