zoukankan      html  css  js  c++  java
  • ES6对继承的体会

    ES6的class方式对于ES5用构造函数的方式创建类,只是一个语法糖并没有根本性的改变,以下是对static,this,以及继承做一个简单的分析

    一、static关键字

    1、加了static情况

     1    class Person {
     2         constructor(name, age) {
     3             this.name = name;
     4             this.age =age;
     5         }
     6 
     7         static say(){
     8             console.log(this.name+","+this.age);
     9         }
    10     }
    11 
    12     let p = new Person("qbin",22);
    13 
    14 
    15     console.log([Person]);
    16     console.log(p);

    此时加了static的say方法作为类的属性,可以直接被类所调用,即Person.say()

    2、不加static的情况

      class Person {
            constructor(name, age) {
                this.name = name;
                this.age =age;
            }
    
            say(){
                console.log(this.name+","+this.age);
            }
        }
        let p = new Person("qbin",22);
    
        console.log([Person]);
        console.log(p);

    此时say加在了类的prototype属性上,通过我前一篇总结文章中讲到 "构造函数.prototype === 其实例化对象._ _proto_ _",即可了解到对象通过_ _proto_ _拿到与之对应的类上的方法

    有些初学者可能会有疑问,其中对象p,没通过_ _proto_ _就成功调用了say()方法,这是为什么?,如下

       class Person {
            constructor(name, age) {
                this.name = name;
                this.age =age;
            }
        
            say(){
                console.log(this.name+","+this.age);
            }
        }
        let p = new Person("qbin",22);
       //此时p没通过__proto__调用say p.say(); console.log([Person]); console.log(p);

     原因是_ _proto_ _默认会一层层自动向下找所需要调用方法,_ _proto_ _可以不写明

     二、this关键字

     1    class Person {
     2         constructor(name,age) {
     3             this.name = name;
     4             this.age = age;
     5         }
     6 
     7         say(){
     8             console.log(this);
     9         }
    10     }
    11     let p = new Person("qbin",22);
    12     p.say();
    13 console.log([Person]);

    可以看出,this指向实例化对象;当对象进行实例化时,this自动指向对象,并进行赋值初始化

    三、继承

    1、观察子类的实例化对象z,如何拿到父类的方法

     1    class Person {
     2         constructor(name, age) {
     3             this.name = name;
     4             this.age =age;
     5         }
     6         say(){
     7             console.log(this.name+","+this.age);
     8         }
     9     }
    10 
    11     class Zhangsan extends Person{
    12         play(){
    13             console.log(this);
    14         }
    15     }
    16 
    17     let z = new Zhangsan("zhangsan",30);
    18     z.say();
    19     
    20     console.log(z);

    可以看出对象实例,通过一层又一层的_ _proto_ _(原型链)拿到了父类方法say,再一次验证上面所说的_ _proto_ _能自动一层层的向下找所需要调用的方法,直到原型链的顶端

    2、观察子类与父类在原型上的关系

     1     class Person {
     2         constructor(name, age) {
     3             this.name = name;
     4             this.age =age;
     5         }
     6         say(){
     7             console.log(this.name+","+this.age);
     8         }
     9     }
    10 
    11     class Zhangsan extends Person{
    12         play(){
    13             console.log(this);
    14         }
    15     }
    16 
    17     let z = new Zhangsan("zhangsan",30);
    18     z.say();
    19 
    20     console.log([Person]);
    21     console.log([Zhangsan]);

    从上图的红框再结合我上一篇总结的文章,我们可以看出  “子类._ _proto_ _ === 父类”

    从上图的绿框在结合我们以往在ES5中所使用的原型链继承方式(《JavaScipt高级程序设计》中提及),惊奇的发现,它本质上就是将“父类的实例赋值给了子类的prototype”,实现了继承

                                                               (字不好看,勿怪啊)

  • 相关阅读:
    627. Swap Salary
    176. Second Highest Salary
    596. Classes More Than 5 Students
    183. Customers Who Never Order
    181. Employees Earning More Than Their Managers
    182. Duplicate Emails
    175. Combine Two Tables
    620. Not Boring Movies
    595. Big Countries
    HDU 6034 Balala Power! (贪心+坑题)
  • 原文地址:https://www.cnblogs.com/qianbin/p/9874542.html
Copyright © 2011-2022 走看看