JS作为一门基于对象的语言,实现对象属性和方法的继承复用是这门语言需要提供的基本功能。
1. prototype继承模式
JS规定,构造函数创建的实例对象,都有一个__.proto.__的属性指向构造函数的prototype属性,而构造函数的prototype属性会指向该实例的原型对象。该原型对象的所有属性和方法,都会被构造函数创建的实例继承。
此种继承方式既能继承父系中的属性,也能继承父系的原型上的属性。如爷继承给父再继承给子,子能获得爷的所有属性和方法。例如:
function Grandpa() {
this.p1 = 'grandpa';
this.say = function () {
console.log('hello');
}
}
function Papa() {
this.p2 = 'papa';
}
function Child() {
this.p3 = 'child';
}
Papa.prototype = new Grandpa();
Papa.prototype.constructor = Papa;
Child.prototype = new Papa();
Child.prototype.constructor = Child;
let child1 = new Child();
console.log(child1.p1);
child1.say();
2. 基于class的继承
JS并不是一门完全的面向对象语言,它没有真正的类(class)。ES6中加入了class的概念,可以用来模拟类。它其实是一种语法糖,它的绝大部分功能,ES5 都可以做到。新的class写法只是让对象原型的写法更加清晰,更像面向对象编程的语法。用class法把上面的例子重写一下:
class Grandpa {
constructor() {
this.p1 = 'grandpa';
}
say() {
console.log('hello');
}
}
class Papa extends Grandpa {
constructor() {
super();
this.p2 = 'papa';
}
}
class Child extends Papa {
constructor() {
super();
this.p3 = 'child';
}
}
let child1 = new Child();
console.log(child1.p1);
child1.say();