ES6 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 故而即可以使用父类的静态方法。
在这里插入图片描述

  需要注意的是,当在子类的静态方法中使用父类的静态方法时,可以把子类替换成 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 的实现原理

总结

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值