开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
在 ES6 之前,JS 没有类和继承的概念,JS 是通过原型来实现继承的,关于原型的详细内容,可参考前面的文章: JS进阶 | 原型和原型链解析 。
除了原型的形式可以实现继承,还有如下几种方法可以实现类的继承:
- 原型链继承
- 构造函数继承(利用 call 来实现)
- 组合继承(call 继承 + 另类原型继承)
- 原型式继承
- 寄生式继承
- 寄生组合式继承
到了 ES6 之后,我们可以使用 Class 关键词定义一个类,使用 extends 来表示继承。
- 子类继承父类,同时也会继承父类的属性和方法。
- 使用 new 关键词创建实例对象,当执行代码的过程中调用一个 Child 类的时候, 会默认调用类中的 constructor() 方法
操作方式如下:
class Father {
constructor(name) {
this.name = name;
}
print() {
console.log('姓名是' + this.name);
}
}
class Child extends Father{
}
let c = new Child('haha');
c.print();
执行 console.log(Child.prototype) ,可以看到父子类之间的结构关系:
注:constructor 中的 this 指向的是 new 出来的实例对象
在 constructor 中使用 super 调用父类,调用父类的构造函数。继承后一定要在constructor中调用super(),并且 super()只能在子类中使用,它表示引用指向父类的方法。
class Child extends Father {
constructor(name, age) {
super(name, age);
this.age = age;
}
study() {
console.log('好好学习 天天向上');
}
}
const c1 = new Child('name123', 84);
c1.study();
总结
- 创建类使用 class 关键词,形式类似于 function,当执行 new class 时,会将 protortype 属性赋值给这个新对象的
_proto_ - 创建构造函数使用 constructor(),constructor 在类执行时会自动调用。
- 子类继承父类,使用 extends 来实现继承。并且需要 在构造函数 constructor 中调用 super(),参数为父类的参数。表示在子类中获取父类的this,等同于:父类.call(this)