自学内容网 自学内容网

【H2O2|全栈】JS案例章节(四)——使用原型的JS工厂模式

目录

前言

开篇语

准备工作

需求

工厂模式 

概念

优点

添加元素的新方法

分析案例

HTML代码

JS实现

结束语


前言

开篇语

本系列为短章节,单独讲述部分特殊重点案例,本期讲述使用原型来实现JS的工厂模式。

与HTML和CSS相比,JS加入了很多逻辑性的元素在里面,所以需要一定的逻辑思维能力,要求能够整合一些知识。如果遇到不理解之处,可以参阅同系列之前的章节。

准备工作

软件:【参考版本】Visual Studio Code

插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap

提示:在不熟练的阶段建议关闭AI助手

浏览器版本:Chrome

系统版本: Win10/11/其他非Windows版本

需求

现在,我们有几组按钮,就像下面这样——

要求是,点击添加按钮,可以在按钮的下方生成一些内容为aa的盒子;

点击删除按钮,可以移除这些盒子。

工厂模式 

概念

工厂(Factory)模式是JS高阶方法中的内容,实际上就是一种创建对象的方式,当我们需要重复创建对象时,只需要不断调用工厂即可。

在ES6中,我们常常使用构造函数定义实例属性,使用原型定义方法和共享属性。这种方式是目前在ECMAScript中使用最广泛,认同度最高的一种使用工厂模式的方法。

优点

工厂模式可以让我们更加方便地创建对象,并帮助我们减少冗余代码,实现前端的性能优化。

同时,由于使用原型定义方法,所以还可以减少内存的消耗

添加元素的新方法

之前我们知道,想要把一个指定的元素添加到盒子中,原生DOM可以使用innerHTML实现。

但是,该方法会覆盖原来的内容,而这不是我们所期望的。

当然,后来我们又学习了使用createElement()和insertBefore(),appendChild()等方法结合使用,这才实现了在指定位置添加DOM元素的方法。

现在,有一种更加简便的在指定位置添加元素的方法insertAdjacentHTML,可以直接解析字符串中的HTML标签,并添加到指定的位置。

这里是一个添加元素的示例——

box.insertAdjacentHTML("beforeEnd", "<div>aa</div>")

"beforeEnd"处填写的是我们插入元素的位置,一般有下面几种——

参数位置
beforeBegin第一个子元素之前插入
afterBegin第一个子元素之后插入
beforeEnd最后一个子元素之前插入
afterEnd最后一个子元素之后插入

"<div>aa</div>"处填写的是需要插入的HTML元素。 

分析案例

HTML代码

这里我们不设置CSS样式,示例HTML代码如下——

    <div class="box">
        <button class="add">添加</button>
        <button class="del">删除</button>
    </div>
    <div class="box1">
        <button class="add1">添加</button>
        <button class="del1">删除</button>
    </div>

JS实现

回到我们的案例,我们实际上需要实现添加盒子删除盒子这两个功能,涉及到的对象有区域盒子(用来装按钮以及新添加的盒子),添加按钮删除按钮

我们先设置一个构造函数,作为我们的工厂。现在,我们为这个工厂添加必要的设备(参数),也就是我们的盒子和按钮——

    function Factory(box, add, del){
        // 获取按钮盒子和按钮
        this.box = document.querySelector(box);
        this.add = document.querySelector(add);
        this.del = document.querySelector(del);
    }

然后,我们需要设置两个按钮的点击事件,由于事件处理程序为方法,所以将它们放在原型中声明——

    Factory.prototype = {
        constructor: Factory,
        addElem() {
            this.box.insertAdjacentHTML("beforeEnd", "<div>aa</div>");    
        },
        delElem() {
            this.box.removeChild(this.box.lastChild);
        }
    }

注意,这里的this指向构造函数Factory,我们期望它指向我们的事件源,并在点击事件onclick后调用。

bind()恰好可以实现手动调用修改this指向的功能。

所以,在构造函数中,我们需要像下面一样绑定点击事件,使用bind()修改事件处理函数的this,使之指向事件源——

    function Factory(box, add, del){
        // 获取按钮盒子和按钮
        this.box = document.querySelector(box);
        this.add = document.querySelector(add);
        this.del = document.querySelector(del);
        // 绑定点击事件
        this.add.onclick = this.addElem.bind(this);
        this.del.onclick = this.delElem.bind(this);
    }

最后,我们就可以利用创建工厂的方式为两个盒子绑定按钮点击事件了——

    var box = new Factory('.box', '.add', '.del');
    var box1 = new Factory('.box1', '.add1', '.del1');

结束语

本期的内容到这里就结束了,在后续的本系列博客中,我会继续更新js的特殊重点案例。

在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。

文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。

==期待与你在下一期博客中再次相遇==

——还在漏气的【H2O2】


原文地址:https://blog.csdn.net/ZC13786305863/article/details/144001705

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!