}
const xiaoqi = new Dog(‘xiaoqi’)
console.log(xiaoqi.run())
console.log(xiaoqi.bark())
此时打印结果如下:
从上面可以看到, Dog
继承了 Animal
类,此时 Dog
就拥有了 Animal
类的属性和方法。而 xiaoqi
实例化了 Dog
,因此它也拥有 Dog
的属性和方法。
多态:
class Animal{
// 构造函数是实例化执行时候的逻辑
constructor(name){
this.name = name
}
run(){
return ${this.name} is running
}
}
const snake = new Animal(‘lily’)
// console.log(snake.run())
//-----------------------------------
class Dog extends Animal{
bark(){
return ${this.name} is barking
}
}
const xiaoqi = new Dog(‘xiaoqi’)
console.log(xiaoqi.run())
console.log(xiaoqi.bark())
//-----------------------------------
class Cat extends Animal{
// 静态方法不需要进行实例化,直接在类上调用即可
static categories = [‘mammal’]
constructor(name){
super(name)
console.log(this.name)
}
run(){
return Meow,
+ super.run()
}
}
const maomao = new Cat(‘maomao’)
console.log(maomao.run())
// 直接访问静态属性
// 为什么要有静态属性?当定义和实例没有太大关系时,可以考虑使用静态方法实现
console.log(Cat.categories)
此时打印结果如下:
阅读代码我们可以发现, xiaoqi
继承了 dog
的 run()
方法,而 Cat
继承了 Animal
类,但是它对 run()
方法进行了改写,因此最终的 run()
方法为改写后的效果。
所以, maomao
继承了 Cat
类,最后 maomao
调用 run()
方法时,就会调用 Cat
里面改写的 run()
方法,而不是 Animal
类的 run()
方法。
这样, xiaoqi
和 maomao
虽然同样继承自 Animal
类,但他们调用 run()
方法的结果各自相互独立,如此,就实现了多态。
同时,我们还要注意一个点,就是静态属性。大家可以看到上面定义的 categories
,用了 static
来定义它为静态属性。当把变量定义为静态属性时,则当外部需要该静态方法时,不需要进行实例化,之类在类上调用即可。
那么问题来了,我们什么时候才需要有静态属性呢?
其实,当定义的内容和实例没有太大关系时,就可以考虑使用静态方法。比如常量的使用,常量基本是固定的,