原型链继承
基本思想:通过原型链继承多个引用类型的属性和方法
我们知道,实例和原型是有直接联系的,实例可以通过
__proto__
访问原型,所以原型链继承即将父类的实例作为子类的原型,这样子类的原型就可以通过__proto__
访问父类的原型了
function Father() {
};
function Son() {
};
// 继承Father
Son.prototype = new Father();
console.log(Son.prototype.__proto__ === Father.prototype); // true
优点
- 父类的方法子类能够被子类复用,因为子类可以访问父类原型,原型存在着父类实例可以共享的方法和属性
缺点
- 更改一个子类的引用,其他子类也会受到影响
function Father() {
};
Father.prototype.colors = ['red', 'black', 'yellow'];
function Son() {
};
Son.prototype = new Father();
let p1 = new Son();
let p2 = new Son();
p1.colors[1] = 'pink';
console.log(p1.colors); // ['red', 'pink', 'yellow']
console.log(p2.colors); // ['red', 'pink', 'yellow']
- 子类在实例化的时候不能向父类传参
盗用构造函数继承
基本思想:在子类构造函数中调用父类构造函数,可以使用call或者apply的方法
function Father() {
this.colors = ['red', 'black', 'yellow'];
};
function Son() {
// 继承Father
Father.call(this); // 通过此方法让子类继承父类中的方法和属性
};
let p1 = new Son();
let p2 = new Son();
console.log(p1.colors); // ['red', 'black', 'yellow']
console.log(p2.colors); // ['red', 'black', 'yellow']