javaScript进阶-面向对象与ES6(8-9th)

因为这周要抽两天做实验和开组会,实验的内容就不发在博客里了

这一阶段主要是学习面向对象与es6的一些知识,计划四天学完,今天是第一天。

JavaScript面向对象编程

1.面向对象编程介绍

1.1 两大编程思想
面向过程
面向对象

1.2 面向过程编程 POP(Process-oriented programming)
面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。

1.3 面向对象编程 OOP (Object Oriented Programming)
面向对象是以对象功能来划分问题,而不是步骤。
javaScript进阶-面向对象与ES6(8-9th)_第1张图片
1.4 面向过程和面向对象的对比
javaScript进阶-面向对象与ES6(8-9th)_第2张图片

2 .ES6中的类和对象

2.1 对象
javaScript进阶-面向对象与ES6(8-9th)_第3张图片
2.2 类 class
javaScript进阶-面向对象与ES6(8-9th)_第4张图片

2.3 创建类
javaScript进阶-面向对象与ES6(8-9th)_第5张图片
2.4 类constructor构造函数
javaScript进阶-面向对象与ES6(8-9th)_第6张图片

<body>
    <script>
        // 1. 创建类 class  创建一个 明星类
        class Star {
            constructor(uname, age) {
                this.uname = uname;
                this.age = age;
            }
        }

        // 2. 利用类创建对象 new
        var ldh = new Star('刘德华', 18);
        var zxy = new Star('张学友', 20);
        console.log(ldh);
        console.log(zxy);
        //(1) 通过class 关键字创建类, 类名我们还是习惯性定义首字母大写
        //(2) 类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象
        //(3) constructor 函数 只要 new 生成实例时,就会自动调用这个函数, 如果我们不写这个函数,类也会自动生成这个函数
        //(4) 生成实例 new 不能省略
        //(5) 最后注意语法规范, 创建类 类名后面不要加小括号,生成实例 类名后面加小括号, 构造函数不需要加function
    </script>
</body>


2.5 类添加方法
javaScript进阶-面向对象与ES6(8-9th)_第7张图片

<body>
    <script>
        // 1. 创建类 class  创建一个 明星类
        class Star {
            // 类的共有属性放到 constructor 里面
            constructor(uname, age) {
                this.uname = uname;
                this.age = age;
            }
            sing(song) {
                // console.log('我唱歌');
                console.log(this.uname + song);

            }
        }

        // 2. 利用类创建对象 new
        var ldh = new Star('刘德华', 18);
        var zxy = new Star('张学友', 20);
        console.log(ldh);
        console.log(zxy);
        // (1) 我们类里面所有的函数不需要写function 
        //(2) 多个函数方法之间不需要添加逗号分隔
        ldh.sing('冰雨');
        zxy.sing('李香兰');
    </script>
</body>

3. 类的继承

3.1 继承
javaScript进阶-面向对象与ES6(8-9th)_第8张图片

3.2 super关键字
javaScript进阶-面向对象与ES6(8-9th)_第9张图片

        class Father {
            constructor(x, y) {
                this.x = x;
                this.y = y;
            }
            sum() {
                console.log(this.x + this.y);

            }
        }
        class Son extends Father {
            constructor(x, y) {
                super(x, y); //调用了父类中的构造函数
            }
        }
        var son = new Son(1, 2);
        var son1 = new Son(11, 22);
        son.sum();
        son1.sum();

javaScript进阶-面向对象与ES6(8-9th)_第10张图片
继承中的属性或者方法查找原则: 就近原则
1 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
2. 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)

    <script>
        // super 关键字调用父类普通函数
        class Father {
            say() {
                return '我是爸爸';
            }
        }
        class Son extends Father {
            say() {
                // console.log('我是儿子');
                console.log(super.say() + '的儿子');
                // super.say() 就是调用父类中的普通函数 say()
            }
        }
        var son = new Son();
        son.say();
        // 继承中的属性或者方法查找原则: 就近原则
        // 1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
        // 2. 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)
    </script>

super 必须在子类this之前调用

    <script>
        // 父类有加法方法
        class Father {
            constructor(x, y) {
                this.x = x;
                this.y = y;
            }
            sum() {
                console.log(this.x + this.y);
            }
        }
        // 子类继承父类加法方法 同时 扩展减法方法
        class Son extends Father {
            constructor(x, y) {
                // 利用super 调用父类的构造函数
                // super 必须在子类this之前调用
                super(x, y);
                this.x = x;
                this.y = y;

            }
            subtract() {
                console.log(this.x - this.y);

            }
        }
        var son = new Son(5, 3);
        son.subtract();
        son.sum();
    </script>

javaScript进阶-面向对象与ES6(8-9th)_第11张图片

4 面向对象案例(第一遍巨费劲)

这个案例我第一遍看的云里雾里,第二遍跟着敲了一遍才理解
主要把js代码放进来吧

var that;
class Tab {
    constructor(id) {
        // 获取元素
        that = this;
        this.main = document.querySelector(id);
        this.add = this.main.querySelector('.tabadd');
        // li的父元素
        this.ul = this.main.querySelector('.fisrstnav ul:first-child');
        // section 父元素
        this.fsection = this.main.querySelector('.tabscon');
        this.init();
    }
    init() {
        this.updateNode();
        // init 初始化操作,让相关的元素绑定事件
        this.add.onclick = this.addTab;
        for (var i = 0; i < this.lis.length; i++) {
            this.lis[i].index = i;
            this.lis[i].onclick = this.toggleTab;
            this.remove[i].onclick = this.removeTab;
            this.spans[i].ondblclick = this.editTab;
            this.sections[i].ondblclick = this.editTab;
        }
    }
    // 因为我们动态添加元素,需要重新获取对应的元素
    updateNode() {
        this.lis = this.main.querySelectorAll('li');
        this.sections = this.main.querySelectorAll('section');
        this.remove = this.main.querySelectorAll('.icon-guanbi');
        this.spans = this.main.querySelectorAll('.fisrstnav li span:first-child');
    }

    // 1.切换功能
    toggleTab() {
        that.clearClass();
        this.className = 'liactive';
        that.sections[this.index].className = 'conactive';
    }
    // 清除所有li和section的类
    clearClass() {
        for (var i = 0; i < this.lis.length; i++) {
            this.lis[i].className = '';
            this.sections[i].className = '';
        }
    }
    // 2.添加功能
    addTab() {
        that.clearClass();
        // (1) 创建li元素和section元素
        var random = Math.random();
        var li = '
  • 测试1
  • '
    var section = '
    测试' + random + '
    '
    ; // (2) 把这两个元素追加到对应的父元素里面 that.ul.insertAdjacentHTML('beforeend', li); that.fsection.insertAdjacentHTML('beforeend', section); that.init(); } // 3.删除功能 removeTab(e) { e.stopPropagation(); // 阻止冒泡,防止触发li的切换点击事件 var index = this.parentNode.index; // 根据索引号删除对应的li和section that.lis[index].remove(); that.sections[index].remove(); that.init(); // 当我们删除的不是选中状态的li的时候,原来的选中状态li保持不变 if (document.querySelector('.liactive')) return; index--; // 手动调动我们的点击事件,不需要鼠标触发 that.lis[index] && that.lis[index].click(); } // 4.修改功能 editTab() { var str = this.innerHTML; // 双击禁止选中文字 window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); // alert(11); this.innerHTML = ' '; var input = this.children[0]; input.value = str; // 让文本框里的文字处于选定状态 input.select(); // 当我们离开文本框的时候就把文本框里的值给span input.onblur = function () { this.parentNode.innerHTML = this.value; } input.onkeyup = function (e) { if (e.keyCode === 13) { // 手动调用表单失去焦点事件 不需要鼠标离开操作 this.blur(); } } } } new Tab('#tab');

    你可能感兴趣的:(javascript,es6,前端)