传统的原型链继承
在 JavaScript 中,对象继承是通过原型链来实现的。每个对象都有一个原型,原型又有自己的原型,形成了一条原型链。
传统的原型链继承有以下缺点:
- 对象实例与构造函数之间的关系不够清晰。
- 继承只能是单向的,即子类只能继承父类的属性和方法,无法向父类传递属性和方法。
- 子类无法重写父类的方法。
ES6 引入了类的概念,通过 class 关键字可以定义一个类。类中可以定义属性和方法,类似于传统的面向对象编程语言。
ES6 的类继承通过 extends 关键字来实现,子类可以继承父类的属性和方法,并且可以重写父类的方法。ES6 的类继承替代了传统的原型链继承,使代码更加清晰易懂。
定义类
定义一个类需要使用 class 关键字,类名一般以大写字母开头。类中可以定义 constructor 构造函数和其他方法。
class Animal { constructor(name) { this.name = name; } say() { console.log('My name is ' + this.name); } }
继承类
使用 extends 关键字可以实现类的继承,子类可以继承父类的属性和方法。
class Cat extends Animal { constructor(name) { super(name); } say() { console.log('I am a cat, my name is ' + this.name); } }
super 关键字
在子类的 constructor 中,必须调用 super() 方法来调用父类的 constructor,否则会报错。
在子类的方法中,可以通过 super 关键字来调用父类的方法。
-- -------------------- ---- ------- ----- --- ------- ------ - ----------------- ---- - ------------ -------- - ---- - ----- - ------------ -------------- -- - ---- -- --- -- - - ---------- - -
静态方法和属性
类还可以定义静态方法和静态属性,使用 static 关键字来定义。
-- -------------------- ---- ------- ----- ------ - ------ ---- - --------- ------ --------- - ----------------------- - ----------------- - --------- - ----- - ----- - --------------- ---- -- - - ----------- - -
示例代码
下面是一个完整的示例代码,演示了 ES6 的类和继承的用法。
-- -------------------- ---- ------- ----- ------ - ------ ---- - --------- ------ --------- - ----------------------- - ----------------- - --------- - ----- - ----- - --------------- ---- -- - - ----------- - - ----- --- ------- ------ - ----------------- ---- - ------------ -------- - ---- - ----- - ------------ -------------- -- - ---- -- --- -- - - ---------- - - --- --- - --- ---------- --- ---------- -- -- ---- -- ---- - -- - ---- -- --- -- - -------------- -- ------
总结
ES6 的类和继承替代了传统的原型链继承,使代码更加清晰易懂。类中可以定义属性、方法、静态方法和静态属性,子类可以继承父类的属性和方法,并且可以重写父类的方法。在子类中必须调用 super() 方法来调用父类的 constructor,可以通过 super 关键字来调用父类的方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65894434eb4cecbf2de86ce3