美文网首页
JS封装功能方式Class&混合模式

JS封装功能方式Class&混合模式

作者: Gino_Li | 来源:发表于2019-03-01 20:14 被阅读0次

    两种方式封装,第一种是自定义对象里的混合模式(原型模式和构造函数模式结合),第二种是CLASS类定义对象。

    以封装选项卡功能为例

    👇HTML和CSS部分

        <style>
            * {
                margin: 0;
                padding: 0;
                list-style: none;
            }
            
            #tab {
                width: 500px;
                height: 500px;
                border: 1px solid black;
                margin: 0 auto;
                text-align: center;
            }
            
            #tab .btns {
                display: flex;
                justify-content: space-between;
                text-align: center;
            }
            
            .btns li {
                width: 33%;
                height: 80px;
                line-height: 80px;
                background: black;
                color: white;
                cursor: pointer;
            }
            
            .btns li:hover {
                opacity: 0.3;
            }
            
            .content {
                margin-top: 50px;
                font-size: 40px;
            }
            
            .content li:not(:first-of-type) {
                display: none;
            }
        </style>
    
        <body>
            <div id="tab">
                <ul class="btns">
                    <li>首页</li>
                    <li>新闻</li>
                    <li>关于我们</li>
                </ul>
                <ul class="content">
                    <li>我是首页内容</li>
                    <li>我是新闻内容</li>
                    <li>我是关于我们内容</li>
                </ul>
            </div>
            </body>
    
    

    混合模式

                function Tab(el){
                    //获取到选项卡最大的容器
                    this.el=document.querySelector(el);
                    //获取所有按钮
                    this.btns= this.el.querySelector('.btns').children;
                    //获取内容
                    this.content = this.el.querySelector('.content').children;
                }
                Tab.prototype.init=function(){
                    var leng = this.btns.length;
                    var that = this;
                    for(var i=0;i<leng;i++){
                        this.btns[i].index=i;
                        this.btns[i].addEventListener('click',function(){
                            for(var j=0;j<leng;j++){
                                that.content[j].style.display='none';
                            }
                            that.content[this.index].style.display='block';
                        })
                    }
                }
                var tab = new Tab('#tab');
                tab.init();
                console.log(tab);
    

    class定义对象(ES6语法,推荐!)

    • 优点:
      1、class 写法更加简洁、含义更加明确、代码结构更加清晰。
      2、class 尽管也是函数,却无法直接调用。
      3、class 不存在变量提升。
      4、class 为污染 window 等全局变量。
      5、class 函数体中的代码始终以严格模式执行
                class Tab{
                    init(){
                        var leng = this.btns.length;
                        //因为下面的点击事件里的this会指向btns,所以要用that变量捕获this,让this指向实例化对象
                        var that = this;
                        //循环第一次获取到每个选项卡按钮
                        for(var i = 0; i < leng; i++) {
                            //储存btns的下标值
                            this.btns[i].index = i;
                            //添加点击事件
                            this.btns[i].addEventListener('click', function() {
                                //循环第二次获取到每个选项卡内容
                                for(var j = 0; j < leng; j++) {
                                    //将所有内容的display设置为none
                                    that.content[j].style.display = 'none';
                                }
                                //根据上面获取到选项卡按钮下标值显示相应的内容
                                that.content[this.index].style.display = 'block';
                            })
                        }
                    }
                }
                class Tabchild extends Tab{
                    constructor(el){
                        super();
                        //获取最大的盒子
                        this.el = document.querySelector(el);
                        //获取按钮,.btns是按钮的爸爸,加上.children就是指向按钮
                        this.btns = this.el.querySelector('.btns').children;
                        //获取内容
                        this.content = this.el.querySelector('.content').children;
                    }
                }
                var tab = new Tabchild('#tab');
                tab.init();
                
    

    相关文章

      网友评论

          本文标题:JS封装功能方式Class&混合模式

          本文链接:https://www.haomeiwen.com/subject/xsyjuqtx.html