jq源码分析 和extend的知识

188 阅读1分钟

jq源码

    <!-- jQuery源码第一行到最后一行是一个匿名函数 -->
    <script src="./kw47jquery.js"></script>
    <script>
        // $('.div1').css('background','red')
        // $('.div1').show();
        // $('.div1').addClass('blue')
        // $('.div1').removeClass('blue')
        $('.div1').click(function(){
            $('.div1').addClass('blue')
            setTimeout(function(){
                $('.div1').hide();
            },2000)
        })

jq转原生对象

        /* 原生转成jq对象 */
        // let h1 = document.querySelector('h1')
        // console.log( $(h1).get(0) )

        /* jq对象转原生的方法 */
        /* 第一种 $(h1)[0] */
        /* 使用$(h1).get(0)方法 可以把单个的jq元素转成原生dom对象 */

        /* 获取的行内元素的样式 */
        // console.log( h1.style.display );

        /* getComputedStyle是用来获取元素的最终样式,它不仅可以获取行内样式,
        也可以获取嵌入式样式,最终获取到的样式是根据优先级来决定的,而style只能获取行内样式
        */
        console.log( window.getComputedStyle($('h1').get(0),null).color )

    </script>

fn.extend

    <button>全选</button>
    <h1>爱好</h1>
    睡觉:<input type="checkbox" name="" id="">
    去网吧:<input type="checkbox" name="" id="">
    熬夜:<input type="checkbox" name="" id="">
    <!-- $.fn.extend() 函数为jQuery扩展一个或多个实例属性和方法 -->
    <script src="./jquery-1.12.4.js"></script>
    <script>
        $.fn.extend({
            checked:function(){
                /* this代表jQuery对象 input元素的集合 */
                // console.log(this);
                this.each(function(i,e){
                    // console.log(i,e);
                    e.checked = true;
                    console.log(e);
                })
            },
            unchecked:function(){
                /* this代表jQuery对象 input元素的集合 */
                // console.log(this);
                this.each(function(i,e){
                    // console.log(i,e);
                    e.checked = false;
                    console.log(e);
                })
            }
        })

        var flag = true
        $('button').click(function(){
            if(flag){
                $(this).text('取消全选')
                $('input').checked();
            }else{
                $(this).text('全选')
                $('input').unchecked();
            }
            flag=!flag;
        })
        
        






        /* $.fn是jQuery的原型对象,
        $.fn.extend()方法用于为jQuery的原型添加新的属性和方法。
        这些方法可以在jQuery实例对象上调用 */
        /*  $('') 就叫做jQuery对象 */
        // $.fn.extend({
        //     consoleFn:function(){
        //         console.log('我自己给jquery对象实现的打印方法')
        //     }
        // })
        // $('body').consoleFn();
        // $('body').css('background','pink')

        


    </script>
</body>

extend

        /* $.extend()函数用于将一个或多个对象的内容合并到目标对象 */
        /* $.extend([deep],target,objectN) */
        /* deep 可选。 Boolean类型 指示是否深度合并对象,默认为false */
        /* target Object类型 目标对象,其他对象的成员属性将被附加到该对象上 */
        /* objectN 需要被合并的对象 */

        // var object1 = {
        //     apple: 0,
        //     banana: {weight: 52, price: 100},
        //     cherry: 97
        // };
        
        /* 默认为false,不深度合并对象 banana的对象的值会被object2的值直接覆盖 */
        // console.log( $.extend(object1,object2) )
        /* 把deep改为true 深度合并对象 banana的对象的值相同的属性会被覆盖,
        不相同的属性仍然保留 */
        // console.log( $.extend(true,object1,object2) )
        // function fn1(obj,flag){
        //     var object2 = {
        //         banana: {price: 200},
        //         durian: 100
        //     };
        //     console.log( $.extend(flag,obj,object2) );
        // }

        // fn1(object1,false)


        

        var car2 = {
            carName:"保时捷",
            color:{name:"帅酷黑"}
        }

        /* 1、把car1进行深度合并 把值打印到控制台上 */
        /* 2、把car1进行 不深度合并 把值打印到控制台上 */
       function showCar(obj){
            /* car1是汽车的默认属性 */
            var car1 = {
                color:{name:"水晶白",price:"1000w"}
            }
            /* 我们可以通过extend对原来的默认属性进行拓展 */
            console.log(obj);
            $.extend(true,car1,obj)
            document.write(`汽车的名字:${car1.carName}   `);
           document.write(`汽车的颜色:${car1.color.name}   `);
           document.write(`汽车的价格:${car1.color.price}`);
       }
       showCar(car2);

    </script>