使用ES6的class实现废话生成器

181 阅读1分钟

内容介绍

看了蛋老师的class视频,跟着学习了一下ES6的class(类)。跟着写了一个叫废话生成器的东西,这个废话生成器跟我预想的也不是一样,但只是为了学习姑且就叫它废话生成器吧。此文算不上技术文章,充其量算是个学习记录。如过有什么错误请各位大佬及时指导。

WechatIMG189.jpeg

代码展示

此部分是完整的代码,复制粘贴可运行。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>废话生成器</title>
    <style>
        .crap_main {
            width: 400px;
            height: 500px;
            margin: 0 auto;
            display: flex;
            flex-flow: column;
            justify-content: flex-start;
            align-items: center;
        }

        .crap_main>.carp_generate {
            width: 100%;
            display: flex;
            flex-flow: row;
            justify-content: space-around;
            align-items: center;
        }

        button {
            border-radius: 15px;
            outline: none;
            border: none;
            background: #409eff;
            color: #ffffff;
            padding: 6px 17px;
        }

        input {
            width: 180px;
            border-radius: 15px;
            border: 1px solid #ccc;
            height: 20px;
            padding: 4px 15px;
            outline: none;
        }

        .crap_main p {
            width: 100%;
            height: 300px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
    </style>
</head>

<body>
    <div class="crap_main">
        <div class="carp_generate">
            <input type="text">
            <button class="first">一级废话</button>
            <button class="second">二级废话</button>
        </div>
        <p id="content"></p>
    </div>
    <script>
        const first = document.querySelector('.first');
        const second = document.querySelector('.second');
        const content = document.querySelector('p');
        const input = document.querySelector('input')

        class BullShit {
            /**
             * 私有属性:子类无法继承父类的私有属性,或者说,私有属性只能定义在它的class里面使用
             * */ 
            #call = '老铁!'
            /**
             * 创建一个静态方法
             * 
             * 类相当于实例的原型,所有在类中定义的方法都会被实例继承,如果在一个方法前加上static关键字,
             * 就表示该方法不会被实例继承,而是直接通过类来调用,这就成为“静态方法”。
             * 
             * 除了私有属性,父类的所有属性和方法都会被子类继承,其中包括静态方法
             * */ 
            static welcome_tips() {
                return '温馨提示:您这是在说废话'
            }
            static welcome() {
                /**
                 * 在一个静态方法里调用另一个静态方法是可以调用this的
                 * 这里的this并不是绑定实例的,这里的this是绑定类本身的。
                 * */ 
                content.innerHTML = this.welcome_tips()
            }
            /**
             * 如果父类定义了私有属性的读写方法,子类就可以通过这些方法,读写私有属性
             * */ 
            getCall() {
                return this.#call
            }
            /**
             * constructor方法是类默认的方法,通过new命令生成实例时自动调用该方法。
             * 一个类必须有constructor()方法,如果没有显示定义,一个空的constructor()会被默认添加。
             * class BullShit(){} 等同于 class BullShit(custructor())
             * */ 
            constructor(text, color) {
                this.text = text;
                this.color = color;
            }
            show() {
                content.innerHTML = `${this.#call}${this.text}${input.value}`
                content.style.color = this.color
            }
            // 再加一些额外的废话,让废话更完善
            /**
             * 在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
             * */ 
            set extra(value) {
                this.value = value;
                content.innerHTML += this.value
            }
            get extra() {
                return `这些是废话:${this.text} ${this.value}`
            }
        }
        /**
         * class可以用extends关键字实现继承,BullShit是父类,son_of_BullShit是子类,子类通过extends继承父类所有的属性和方法
         * */ 
        class son_of_BullShit extends BullShit {
            constructor(text, color, fontSize) {
                /**
                 * super在这里表示父类的构造函数,用来新建一个父类的构造函数。
                 * 
                 * ES6规定,子类必须在父类的constructor方法中调用super(),否则会报错。这是因为子类自己的this对象,
                 * 必须通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,添加子类自己的实例属性和方法,
                 * 如果不调用super()方法,子类就得不到自己的this对象。
                 * 
                 * super()只能用于子类的构造函数之中,用在其他地方就会报错
                 * 
                 * */ 
                super(text, color)
                this.fontSize = fontSize
            }
            show() {
                content.innerHTML = `${this.getCall()}${this.text}${content.innerHTML}`
                content.style.color = this.color
                content.style.fontSize = this.fontSize
            }
        }
        // 给一级废话按钮添加点击事件
        first.addEventListener('click', () => {
            /**
             * 使用时也是直接对类使用new命令,跟构造函数用法完全一致
             * bullshit是BullShit的实例,
             * */ 
            const bullshit = new BullShit('我知道', "#00a1d6")
            bullshit.show()
            bullshit.extra = '儿'
            console.log(bullshit.extra)
        });
        // 给二级废话按钮添加点击事件
        second.addEventListener('click', () => {
            const son_of_bullshit = new son_of_BullShit('我知道', "#00a1d6", '30px')
            son_of_bullshit.show()
        });
        // 给p标签添加点击事件
        content.addEventListener('click', () => {
            // 使用类调用静态方法
            BullShit.welcome()
        })

    </script>
</body>

</html>