• 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”,实现了继承

                                                               (字不好看,勿怪啊)

  • 相关阅读:
    匈牙利算法(Kuhn-Munkres)算法
    城城城城
    Windows平台将远程服务器的目录挂载为本地磁盘
    怎么看自己电脑的内存多少赫兹
    sqlserver isnull函数
    带参数的存储过程
    EFCore学习记录笔记
    js保留两位小数方法总结
    C#中 ??、 ?、 ?: 、?.、?[ ] 问号
    C#枚举转化示例大全,数字或字符串转枚举
  • 原文地址:https://www.cnblogs.com/qianbin/p/9874542.html
Copyright © 2020-2023  润新知