JS库封装

1.入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //给页面中所有的div设置字体颜色为红色
    //$("div").css("color","red")

    //1、要封装的这个库应该是一个独立的单元:模块化
    //  -->独立:a、不依赖任何其他第三方库
    //          b、里面的东西大部分也是与世隔绝的,只有:$、jQuery

    (function(global){
        //global保存了window对象的引用

        function jQuery(){

        }

        //window.$ = window.jQuery = jQuery;

        //相当于:
        global.jQuery=jQuery;
        global.$=jQuery;
    })(window)
</script>
</html>

02-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>
</body>
<script>
    //给页面中所有的div设置字体颜色为红色
    //$("div").css("color","red")

    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中

            const elements = document.getElementsByTagName(selector);
            //这样的话,随着$()操作频次的增加,会产生无数个相同的css方法,造成内存浪费
            elements.css=()=>{

            }
            return elements;
        }

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css()
    $("p")
    $("span")
    $("img")
    $("input")
</script>
</html>

03-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>
</body>
<script>
    //给页面中所有的div设置字体颜色为红色
    //$("div").css("color","red")

    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中

            const elements = document.getElementsByTagName(selector);
            //这样的话,随着$()操作频次的增加,会产生无数个相同的css方法,造成内存浪费
            return elements;
        }

        //解决方案,把DOM操作的方法都放在了原形中,这样看似可以正常访问,但是依然存在问题:破坏了原生的对象结构
        //-->
        HTMLCollection.prototype.css=()=>{
            console.log('css方法');
        }

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css()
</script>
</html>

04-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <div class="header">123</div>
</body>
<script>
    //给页面中所有的div设置字体颜色为红色
    //$("div").css("color","red")

    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中

            
            //这样的话,随着$()操作频次的增加,会产生无数个相同的css方法,造成内存浪费
            return new F(selector);
        }

        //jquery对象的构造函数
        function F(selector){
            //把DOM元素放到这个对象中
            const elements = document.getElementsByTagName(selector);
            //为了让这些元素可以在css方法中进行访问,所以需要把这些元素放在对象上面进行传递
            this.elements = elements;
        }
        F.prototype.css=function(name,value){
            for(let i = 0;i<this.elements.length;i++){
                let element = this.elements[i];
                element.style[name]=value;
            }
        }

        

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css("color","red")
    $(".header").css("backgroundColor","pink")
    $("#inputId").css("backgroundColor","black")
</script>
</html>

05-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <span class="header">123</span>
    <input type="text" id="inputId">
</body>
<script>
    //给页面中所有的div设置字体颜色为红色
    //$("div").css("color","red")

    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中

            
            //这样的话,随着$()操作频次的增加,会产生无数个相同的css方法,造成内存浪费
            return new F(selector);
        }

        //jquery对象的构造函数
        function F(selector){
            //jquery内部封装了一个Sizzle引擎来获取DOM元素

            //把DOM元素放到这个对象中
            const elements = document.querySelectorAll(selector)
            //为了让这些元素可以在css方法中进行访问,所以需要把这些元素放在对象上面进行传递
            this.elements = elements;
        }
        F.prototype.css=function(name,value){
            for(let i = 0;i<this.elements.length;i++){
                let element = this.elements[i];
                element.style[name]=value;
            }
        }

        

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css("color","red")
    $(".header").css("backgroundColor","pink")
    $("#inputId").css("backgroundColor","black")
</script>
</html>

06-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <span class="header">123</span>
    <input type="text" id="inputId">
</body>
<script>
    //给页面中所有的div设置字体颜色为红色
    //$("div").css("color","red")

    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中
            return new F(selector);
        }

        //jquery对象的构造函数
        function F(selector){
            //把DOM元素放到这个对象中
            const elements = document.querySelectorAll(selector)
            //jquery为了后续的DOM操作的方便,将这些获取到的DOM元素全部放在了对象自己身上,让自己变成了一个就像数组一样,可以使用for循环进行遍历,我们把这种对象特性称之为【伪数组】

            //实现把这些所有DOM元素都添加到对象自己身上
            for(let i = 0;i<elements.length;i++){
                //ele:DOM元素
                this[i] = elements[i];
            }
            this.length=elements.length;
            
        }

        F.prototype = {
            constructor:F,
            //此时的css方法还是雏形,后续完善
            css(name,value){
                for(let i = 0;i<this.length;i++){
                    let element = this[i];
                    element.style[name]=value;
                }
            }
        }

        

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css("color","red")
    $(".header").css("backgroundColor","pink")
    $("#inputId").css("backgroundColor","black")

    //实现的结果:没需要需要new一个对象,但是对象的方法是共用的
    var $1=$("div");
    var $2=$("div");
    console.log($1 == $2); //2个对象,false
    console.log($1.css == $2.css); //同一个方法,true

    //jquery对象不可能相同,后续,内存优化介绍如何适当地解决这种jquery对象消耗的内存
</script>
</html>

07-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <span class="header">123</span>
    <input type="text" id="inputId">
</body>
<script>
    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中
            var _init=jQuery.prototype.init;
            return new _init(selector);
            
            //等价于:
            //return new jQuery.prototype.init(selector);
        }

        jQuery.prototype = {
            constructor:jQuery,
            init:function(selector){
                //把DOM元素放到这个对象中
                const elements = document.querySelectorAll(selector)

                for(let i = 0;i<elements.length;i++){
                    this[i] = elements[i];
                }
                this.length=elements.length;
                
            },
            //此时的css方法还是雏形,后续完善
            css(name,value){
                for(let i = 0;i<this.length;i++){
                    let element = this[i];
                    element.style[name]=value;
                }
            }
        }

        //此时创建的jquery是init构造函数的实例
        //css方法在jquery.prototype对象中
        //-->为了让jquery对象可以访问到css方法
        //  -->让init的原型继承自jQuery.prototype
        jQuery.prototype.init.prototype = jQuery.prototype;

        //-->1、创建了一个init的对象
        //-->2、执行css方法
        //  -->找对象本身有没有css方法,并没有
        //  -->找对象的原型:init.prototype -->jquery.prototype
        //  -->发现jquery.prototype中有一个css方法

        

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css("color","red")
    $(".header").css("backgroundColor","pink")
    $("#inputId").css("backgroundColor","black")

    //实现的结果:没需要需要new一个对象,但是对象的方法是共用的
    var $1=$("div");
    var $2=$("div");
    console.log($1 == $2); //2个对象,false
    console.log($1.css == $2.css); //同一个方法,true

    //jquery对象不可能相同,后续,内存优化介绍如何适当地解决这种jquery对象消耗的内存
</script>
</html>

08-入口函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <span class="header">123</span>
    <input type="text" id="inputId">
</body>
<script>
    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中
            return new jQuery.fn.init(selector);
        }
        
        //给jquery添加了一个fn属性,fn属性等价于prototype属性
        jQuery.fn = jQuery.prototype = {
            constructor:jQuery,
            init:function(selector){
                //把DOM元素放到这个对象中
                const elements = document.querySelectorAll(selector)

                for(let i = 0;i<elements.length;i++){
                    this[i] = elements[i];
                }
                this.length=elements.length;
                
            },
            //此时的css方法还是雏形,后续完善
            css(name,value){
                for(let i = 0;i<this.length;i++){
                    let element = this[i];
                    element.style[name]=value;
                }
            }
        }

        //此时创建的jquery是init构造函数的实例
        //css方法在jquery.prototype对象中
        //-->为了让jquery对象可以访问到css方法
        //  -->让init的原型继承自jQuery.prototype
        jQuery.fn.init.prototype = jQuery.fn;

        

        window.$ = window.jQuery = jQuery;
    })(window)

    
    $("div").css("color","red")
    $(".header").css("backgroundColor","pink")
    $("#inputId").css("backgroundColor","black")

    //实现的结果:没需要需要new一个对象,但是对象的方法是共用的
    var $1=$("div");
    var $2=$("div");
    console.log($1 == $2); //2个对象,false
    console.log($1.css == $2.css); //同一个方法,true

    //jquery对象不可能相同,后续,内存优化介绍如何适当地解决这种jquery对象消耗的内存
</script>
</html>

09-extend方法.1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <span class="header">123</span>
    <input type="text" id="inputId">
</body>
<script>
    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中
            return new jQuery.fn.init(selector);
        }
        
        //给jquery添加了一个fn属性,fn属性等价于prototype属性
        jQuery.fn = jQuery.prototype = {
            constructor:jQuery,
            init:function(selector){
                //把DOM元素放到这个对象中
                const elements = document.querySelectorAll(selector)

                for(let i = 0;i<elements.length;i++){
                    this[i] = elements[i];
                }
                this.length=elements.length;
                
            },
            //此时的css方法还是雏形,后续完善
            css(name,value){
                for(let i = 0;i<this.length;i++){
                    let element = this[i];
                    element.style[name]=value;
                }
            }
        }

        //此时创建的jquery是init构造函数的实例
        //css方法在jquery.prototype对象中
        //-->为了让jquery对象可以访问到css方法
        //  -->让init的原型继承自jQuery.prototype
        jQuery.fn.init.prototype = jQuery.fn;

        jQuery.extend = function(...args){
            //这里的extend方法参数并不确定
            //所以建议不要指定形参,通过函数内置对象arguments来进行操作

            console.log(args);

            const target = args[0];

            //进行对象拷贝,需要将第二个参数及其后面的所有参数中的属性遍历添加到第一个参数中
            for(let i = 1;i<args.length;i++){
                //每一个实参:对象
                let arg = args[i];
                //取出对象中的每一个属性
                for (let key in arg) {
                    //把该属性添加到第一个参数中
                    target[key] = arg[key];
                }
            }

            return target;
        }

        

        window.$ = window.jQuery = jQuery;
    })(window)

    var p = {};
    $.extend(p,{a:10},{b:20},{c:30})

    //$.extend:
    
    // var obj={ name:"xxx",age:18}
    // var obj3={ gender:"女"}
    // var obj2={};

    //将obj、obj3中的属性一一的遍历添加到obj2对象中
    //$.extend(obj2,obj,obj3)


    //作业:使用es6中的对象扩展运算符改写extend方法
</script>
</html>

10-extend方法.2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>aaa</div>
    <div>bbb</div>
    <div>ccc</div>

    <span class="header">123</span>
    <input type="text" id="inputId">
</body>
<script>
    //$("div")
    (function(global){

        function jQuery(selector){

            //1、获取页面中所有的元素
            //2、把这个元素放在一个特定的对象中
            return new jQuery.fn.init(selector);
        }
        
        //给jquery添加了一个fn属性,fn属性等价于prototype属性
        jQuery.fn = jQuery.prototype = {
            constructor:jQuery,
            //init是一个构造函数
            //-->构造函数内部的this指向init的实例
            init:function(selector){
                //把DOM元素放到这个对象中
                const elements = document.querySelectorAll(selector)
                
                //为了让css方法中可以访问到DOM元素,所以需要把elements里面的元素存放在this中
                for(let i = 0;i<elements.length;i++){
                    this[i] = elements[i];
                }
                this.length=elements.length;
                //对象结构:{ 0:div,1:div,2:div,length:3 }
                
            },
            //此时的css方法还是雏形,后续完善
            css(name,value){
                for(let i = 0;i<this.length;i++){
                    let element = this[i];
                    element.style[name]=value;
                }
            }
        }

        //此时创建的jquery是init构造函数的实例
        //css方法在jquery.prototype对象中
        //-->为了让jquery对象可以访问到css方法
        //  -->让init的原型继承自jQuery.prototype
        jQuery.fn.init.prototype = jQuery.fn;

        jQuery.fn.extend = jQuery.extend = function(...args){
            //2个extend方法区别在于:
            //1、接收数据的对象发生了变化
            //  -->$.extend:第一个实参
            //  -->$.fn.extend:this
            //2、提供数据的对象发生了变化:
            //  -->$.extend:第二个参数及其后面的参数
            //  -->$.fn.extend:所有的参数

            //后面的拷贝过程都是一样的

            let target,source=[];

            source=[...args];
            
            //判断2种情况       
            //  $.extend    -->jQuery.extend 方法调用形式
            if(this === jQuery){
                //$.extend
                target=args[0];
                
                source.splice(0,1); //删除第一个元素
            }else{
                //$.fn.extend
                target = this;
            }
            
            //实现拷贝部分的逻辑:
            source.forEach(function(item,index){
                //item:就是每一个数据源对象(提供数据的对象)
                
                //取出item对象中的每一个属性:for...in
                Object.keys(item).forEach((key)=>{
                    //key就是对象中每一个属性名
                    target[key]=item[key];
                })
            });

            return target;


        }

        

        global.$ = global.jQuery = jQuery;
    })(window)

    var p = {};
    $.extend(p,{a:10},{b:20},{c:30})

    //第二个extend方法:其实就是为了给
    //$.fn.extend:这是编写jquery插件的核心方法
    //-->功能就是把这些方法添加到原型中
    $.fn.extend({
        dateTimePicker(){

        },
        getDate(){

        }
    })
</script>
</html>

这个代码是,一步一步调试过来的,需要一个一个文件来复习!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,请求封装是指将HTTP请求的发送和处理进行封装,以便于开发者更方便地发送和处理HTTP请求。以下是一种常见的Node.js请求封装方式: 1. 使用第三方:Node.js中有很多第三方可以用来封装HTTP请求,其中比较常用的是`axios`和`request`。这些提供了简洁的API,可以轻松地发送GET、POST等各种类型的请求,并处理响应。 2. 创建一个封装函数:你也可以自己创建一个封装函数来发送HTTP请求。这个函数可以接收请求的URL、请求方法、请求头、请求体等参数,并返回一个Promise对象,用于处理响应结果。 下面是一个简单的示例代码,演示了如何使用`axios`进行请求封装: ```javascript const axios = require('axios'); async function sendRequest(url, method, headers, data) { try { const response = await axios({ url: url, method: method, headers: headers, data: data }); return response.data; } catch (error) { throw new Error(error.message); } } // 使用示例 const url = 'https://api.example.com/users'; const method = 'GET'; const headers = { 'Content-Type': 'application/json' }; const data = { username: 'example' }; sendRequest(url, method, headers, data) .then(response => { console.log(response); }) .catch(error => { console.error(error); }); ``` 这个示例中,`sendRequest`函数接收URL、请求方法、请求头和请求体作为参数,使用`axios`发送HTTP请求,并返回响应结果。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值