继承是面向对象编程语言的一个特性,子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。而 Js 不是面向对象语言,但是可以通过原型来实现继承,在 es5 中,继承可以用寄生组合继承来实现。
寄生组合继承
寄生组合继承的实现主要有三步
- 子类实现父类的构造函数的属性和方法
- 子类的
prototype
的__proto__
指向父类的prototype
- 修改子类原型链上的
constructor
指向子类的构造函数
比如下面一个构造函数
function Animal(name) { this.name = name;}Animal.prototype.say = function () { console.log(`I'm ${this.name}`);};let animal = new Animal('animal');animal.say();
实现一个鸟继承自动物,根据上面的步骤
// 第一步function Bird(name) { Animal.apply(this, arguments);}// 第二步Bird.prototype = Object.create(Animal.prototype);// 第三步Bird.prototype.constructor = Bird;let bird = new Bird('anger bird');bird.say();
class 实现继承
es6 提供的类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式和类声明。可以用 class 来实现继承,例如上面的例子可以用 es6 来写
MDN 指出,类语法不会为 JavaScript 引入新的面向对象的继承模型。
class Animal { constructor(name) { this.name = name; } say() { console.log(`I'm ${this.name}`); }}let animal = new Animal('animal');animal.say();class Bird extends Animal { constructor(name) { super(name); }}let bird = new Bird('anger bird');