开篇
JS继承也不像其他语言中的继承一样(其他语言:子类继承父类,就是拷贝一份父类的属性和方法),js中他是把父类的实例放到子类的原型链上,子类实例想要去调用这些属性和方法的时候,实际上是基于__proto__原型链查找的形式去完成的
继承就是让子类继承父类的属性和方法
目的是可以让子类的实例能够使用父类的属性和方法
每一种继承法方式都有它的优缺点
1.原型链继承:
让子类的原型指向父类的实例;
// 父类构造函数
function A(x) {
this.x = x
}
// 父类原型
A.prototype.getx = function () {
console.log("getx", this.x);
}
let a = new A(100)
console.log(a);//A {x: 100}
// 子类构造函数
function B(y) {
this.y = y
}
B.prototype = new A(100)
B.prototype.constructor = B
B.prototype.gety = function () {
console.log("gety", this.y);
}
// 子类实例
let b = new B(200)
console.log(b);//B {y: 200}
特点:
子类实例可以直接修改父类上的方法(这样就会导致其它父类实例都会受到影响)。
父类中的私有属性和方法,在实现原型链继承之后都都会变成子类公有的属性和方法。
2.call继承(借用构造函数继承)
在子类内,使用call()调用父类方法,并将父类的this修改为子类的this。相当于是把父类的实例属性复制了一份放到子类的函数内;
// 父类构造函数
function A(x) {
this.x = x
this.say = function () {
console.log('kin');
}
}
// 父类原型
A.prototype.getx = function (