ES6 Class的原理,一篇文章讲明白静态继承

该篇博文参考以下文章

  • ES6 Class 继承与 super
  • ECMAScript6(ES6)标准之class类的定义、继承及静态方法
  • es6中class类的全方面理解(三)------静态方法

文章目录

    • Class中的静态继承
    • 总结

Class中的静态继承

  静态继承在 ES6 中是通过关键字 static 来标识。不需要实例化类,即可直接通过该类来调用的方法,即称之为“静态方法”。

  静态方法不会被实例继承!父类的静态方法, 可以被子类继承!这两句话看着有点绕,我们通过代码来理解。

class Animal{
    static run(){
        return "Animal runs"
    }
    say(){
        console.log(this.run());//TypeError: this.run is not a function
    }
}
var lobster = new Animal();
lobster.say();

  上面执行结果会报错,原因是: run 不是一个函数,可以看出, say 方法执行正常,而静态方法 run 却执行报错。也就是说 实例 fish 没有继承构造函数的静态方法。

class Animal {
    static run(){
        return "Animal runs"
    }
}
class Fish extends Animal {}
//子类Fish 可以直接调用父类的静态方法run
console.log(Fish.run()); 

  上面执行结果说明,子类对于父类的静态方法可以随便使用。

  举个生动形象的例子,现在有一个父类 Animal (动物) ,当实例化一个 Animal 的实例的时候,就相当于创建了一个活生生的 lobster (龙虾),这个 lobster 不会继承 Animal 的静态方法。

  当创建一个新类 Fish 的时候,就相当于创建了一个新的范围,该范围继承 Animal 故而即可以使用父类的静态方法。
ES6 Class的原理,一篇文章讲明白静态继承_第1张图片

  需要注意的是,当在子类的静态方法中使用父类的静态方法时,可以把子类替换成 super ,代码如下:

class Animal {
    static run(){
        return "Animal runs"
    }
}

class Rabbit extends Animal {
    static hello(){
        return Rabbit.run() === super.run() //true
    }
}
console.log(Rabbit.hello());

  为什么能替换成 super ,这个问题可以查看下面博文,里面会解释 super 的实现原理

总结

   静态方法是给静态的东西用的,类是静态的概念,所以只有类才能调用静态方法,实例化的东西会变成动态的,只能使用动态方法




你可能感兴趣的:(ES6,es6)