15-JS封装:入口函数

news2024/11/27 14:28:40

目录

1 模块化的基本结构

2 编写封装里的jQuery函数

2.1 对象本身上添加css方法

 2.2 对象原型上添加css方法

2.3 自定义构造函数 

2.4 优化1-伪数组

2.5 优化2-原型链

 2.6 简化代码


需求:给页面中所有的div设置字体颜色为红色

jQuery封装:$("div").css("color","red")

如果没有引入jQuery,该如何编写?

1 模块化的基本结构

要封装的这个库应该是一个独立的单元:模块化

独立:

  1. 不依赖任何其他第三方库
  2. 里面的东西大部分也是与世隔绝的,只有:$、jQuery

模块化的基本结构

    (function (global) {

        function jQuery() {

        }

        //global.$ = global.jQuery = jQuery;

        //相当于:
        global.jQuery = jQuery;
        global.$ = jQuery;
    })(window)

1) 传入window,global接收window,即global保存了window对象的引用

2)在global(相当于window)里添加一个方法jQuery,并将模块化里的jQuery函数将其赋值

3)在global(相当于window)里添加一个方法$,并将模块化里的jQuery函数将其赋值

2 编写封装里的jQuery函数

2.1 对象本身上添加css方法

步骤:

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

观察$("div").css("color","red")所得:

直接在jQuery函数里elementsc添上css方法

(function(global){

        function jQuery(selector){

            const elements = document.getElementsByTagName(selector);
            elements.css=()=>{

            }
            return elements;
        }

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

    
    $("div").css()
    $("p")
    $("span")
    $("img")
    $("input")

 问题:随着$()操作频次的增加,会产生无数个相同的css方法,造成内存浪费

 2.2 对象原型上添加css方法

放在对象本身上会造成浪费,则我们优化成:放在对象的原型上 

(function(global){

        function jQuery(selector){

            const elements = document.getElementsByTagName(selector);
            return elements;
        }

 
        HTMLCollection.prototype.css=()=>{
            console.log('css方法');
        }

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

    $("div").css()

这种解决方案,把DOM操作的方法都放在了原型中,这样看似可以正常访问,但是依然存在问题:破坏了原生的对象结构

2.3 自定义构造函数 

自定义构造函数 F,在F的原型上添加css方法

<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){

            return new F(selector);
        }

        //jquery对象的构造函数
        function F(selector){
            //jquery内部封装了一个Sizzle引擎来获取DOM元素
            
            const elements = document.querySelectorAll(selector) //把DOM元素放到这个对象中
           
            this.elements = elements; //为了让这些元素可以在css方法中进行访问,所以需要把这些元素放在对象上面进行传递
        }

        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>

2.4 优化1-伪数组

    jquery为了后续的DOM操作的方便,将这些获取到的DOM元素全部放在了对象自己身上,让自己变成了一个就像数组一样,可以使用for循环进行遍历,我们把这种对象特性称之为【伪数组】

(function(global){

        function jQuery(selector){

            return new F(selector);
        }
        
        function F(selector){
            //把DOM元素放到这个对象中
            const elements = document.querySelectorAll(selector)

            //实现把这些所有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对象消耗的内存

2.5 优化2-原型链

1、jQuery函数里返回的是构造函数(jQuery原型里的init函数)

2、jQuery原型里有的css函数

3、jQuery.prototype.init(selector)只能访问本身及其原型里的内容(原型:构造函数.prototype)

4、所以 jQuery.prototype.init.prototype = jQuery.prototype;

<script>
    (function(global){

        function jQuery(selector){

            var _init=jQuery.prototype.init;
            return new _init(selector);
            
            //等价于:
            //return new jQuery.prototype.init(selector);
        }

        jQuery.prototype = {
            constructor:jQuery,
            init:function(selector){
              
                const elements = document.querySelectorAll(selector)

                for(let i = 0;i<elements.length;i++){
                    this[i] = elements[i];
                }
                this.length=elements.length;
                
            },
           
            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")

    var $1=$("div");
    var $2=$("div");
    console.log($1 == $2); //2个对象,false
    console.log($1.css == $2.css); //同一个方法,true

</script>
 2.6 简化代码

1、考虑到需要经常访问jQuery.prototype

2、给jQuery添加了一个fn属性,fn属性等价于prototype属性

3、访问jQuery.fn相当于访问jQuery.prototype

(function(global){

        function jQuery(selector){

            return new jQuery.fn.init(selector);
        }
        
        //给jquery添加了一个fn属性,fn属性等价于prototype属性
        jQuery.fn = jQuery.prototype = {
            constructor:jQuery,
            init:function(selector){
                
                const elements = document.querySelectorAll(selector)

                for(let i = 0;i<elements.length;i++){
                    this[i] = elements[i];
                }
                this.length=elements.length;
                
            },
            
            css(name,value){
                for(let i = 0;i<this.length;i++){
                    let element = this[i];
                    element.style[name]=value;
                }
            }
        }

        
        jQuery.fn.init.prototype = jQuery.fn;

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1845161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1964springboot VUE 智慧社区可视化平台系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE社区可视化平台系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码…

INFINI Labs 助力开源与教育:免费许可证计划全面升级

在数字化浪潮席卷全球的今天&#xff0c;INFINI Labs 深刻认识到开源项目和教育机构在技术创新与人才培养中的核心作用。因此&#xff0c;我们郑重推出全新升级的免费许可证计划&#xff0c;旨在全球范围内为开源社区和教育界提供有力支持&#xff0c;共同推动软件生态的繁荣与…

策略模式编程

接口定义&#xff1a; public interface ProcessParserStrategy { List<ProcessInfo> parser(String osType, String processInfo); String getApp(); } public interface ConfigParserStrategy { List<ConfigInfo> parser(String configInfo); String getConfigT…

DC/AC电源模块:为通信设备提供稳定的电力供应

BOSHIDA DC/AC电源模块&#xff1a;为通信设备提供稳定的电力供应 在现代通信系统中&#xff0c;稳定可靠的电力供应是确保信息传输连续性和服务质量的关键因素之一。DC/AC电源模块作为通信设备能源管理的核心组件&#xff0c;扮演着至关重要的角色。它不仅负责将输入的直流电…

Spring自定义标签体系和应用

我们知道&#xff0c;在使用Dubbo框架时&#xff0c;需要指定配置文件中的application、protocol、registry、provider、service等服务器端和客户端的配置项&#xff0c;典型的配置方法如下所示。通过这些配置项&#xff0c;我们可以基于Spring容器来启动Dubbo服务。 <!-- …

pytorch lighting: Trying to resize storage that is not resizable

问题 在用pytorch lighting进行训练时碰到如下错误 即 Trying to resize storage that is not resizable 。 解决方案 在dataloader采样图片以及label时&#xff0c;保证每次采样的图片的分辨率不变。

抖去推,筷子剪辑,超级编导短视频矩阵系统,应该怎么选择?

选择一个适合您需求的软件平台&#xff0c;然后按照以下步骤进行选择&#xff1a; 研究和比较不同平台&#xff1a;比较不同的短视频编辑软件&#xff0c;例如抖音、快手等&#xff0c;看看它们提供了哪些功能和特点。 确定需求&#xff1a;确定您希望在短视频中实现的功能和效…

每天写java到期末考试(6.21)--集合4--练习--6.20

练习1&#xff1a; 正常写集合 bool类 代码&#xff1a; import QM_Fx.Student;import java.util.ArrayList;public class test {public static void main(String[] args) {ArrayList<Student> listnew ArrayList<>();//2.创建学生对象Student s1new Student(&quo…

C语言 | Leetcode C语言题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; int majorityElement(int* nums, int numsSize) {int ans 0;for (int i 0, cnts 0; i < numsSize; i) {if (nums[i] ans) {cnts;} else if (cnts 0) {ans nums[i];} else {cnts--;}}return ans; }

python逆序输出IP地址 青少年编程电子学会python编程等级考试三级真题解析2021年12月

python逆序输出IP地址 2021年12月 python编程等级考试级编程题 一、题目要求 1、编程实现 请读取文件IP.txt的数据&#xff0c;数据内容如下图显示&#xff0c;文件中每一行存储一个P地址&#xff0c;下列代码实现了读取数据&#xff0c;每次读取一行数据&#xff0c;都删除…

HTTP详细总结

概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 特点 基于TCP协议: 面向连接&#xff0c;安全 TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议&#xff0c;在…

驾校OBD接入CAN总线数据大众朗逸仪表网关位置

在汽车的复杂电路网络中&#xff0c;仪表网关扮演着信息枢纽的角色。对于驾校使用大众朗逸车主而言&#xff0c;了解仪表网关的位置不仅有助于日常维护&#xff0c;更是故障诊断和车辆升级的关键所在。 大众朗逸作为一款深受消费者喜爱的车型&#xff0c;凭借其稳定的性能和经…

基于SSM+Jsp的水果销售管理网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

BirdTalk IM集群中消息流转策略讨论

BirdTalk IM集群中消息流转策略讨论 目前群聊的存储策略是1写多读方案&#xff1b;每个群组一个队列&#xff0c;按时间顺序排列&#xff0c;不区分用户&#xff1b; 私聊的存储是写扩散的&#xff0c;每个人都有自己的消息队列&#xff0c;按时间顺序 保存所有的消息&#x…

详细分析Matplotlib 绘制三维曲线图的细节(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于Matplotlib的基本知识推荐阅读&#xff1a;python之Matplotlib详细分析&#xff08;附代码&#xff09; 1. 基本知识 Matplotlib 是 Python 中常用的绘图库&#xff0c;可以用于生成各种类型的图表&#xff0c;包括三维曲线图 在三维…

Protobuf安装配置--附带每一步截图

Protobuf Protobuf&#xff08;Protocol Buffers&#xff09;协议是一种由 Google 开发的二进制序列化格式和相关的技术&#xff0c;它用于高效地序列化和反序列化结构化数据&#xff0c;通常用于网络通信、数据存储等场景。 为什么要使用Protobuf Protobuf 在许多领域都得到…

如何利用AI大模型设计电机本体?

一、背景 AI在电机本体设计中的应用正逐渐成为提升设计效率、优化性能和降低成本的重要手段。通过深度学习、机器学习、计算机辅助设计&#xff08;CAD&#xff09;和仿真技术的结合&#xff0c;AI能够帮助工程师更快速准确地完成电机的设计与优化工作。以下是AI在电机本体设计…

关于如何得到Mindspore lite所需要的.ms模型

关于如何得到Mindspore lite所需要的.ms模型 一、.ckpt模型文件转.mindir模型二、.mindir模型转.ms模型三、其它3.1 代码3.2 数据 四、参考文档 一、.ckpt模型文件转.mindir模型 由于要得到ms模型&#xff0c;mindspore的所有模型里面&#xff0c;是必须要用mindir模型才可以进…

华为OD机试 - 环中最长子串 - 滑动窗口(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

【总结】ui自动化selenium知识点总结

1. 大致原理 首页安装第三方库selenium库&#xff0c; 其次要下载好浏览器驱动文件&#xff0c;比如谷歌的 chromedriver.exe&#xff0c;配置上环境变量。 使用selenium的webdriver类去创建一个浏览器驱动对象赋值叫driver&#xff0c;一个浏览器驱动对象就可以 实现 对浏…