JavaScript的继承方法有很多,下面就来梳理讲解一下最常见的三种继承方法:
1.原型链直接继承
如果说B要继承A,则可以
B.protoytpe = A.prototype
或
B.prototype = new A()
两种方法都是通过直接继承原型的方法来完成继承的。
缺点:
1.B构造出得对象无法向A构造函数传参。
2.继承单一。
3.所有B构造出来的对像都会共享A的实例属性。(原型上的属性共享,一个实例区修改原型方法,其余的所有实例原型上的该方法都会被修改)
2.原型间接继承
同样的,B要继承A的话,可以
C.prototype = A.prototype
B.prototype = C.prototype
或
C.prototype = A.prototype
B.prototype = new C()
两种方法都是通过间接继承原型的方法来完成继承的。
特点:
1.跟上面方法作比较,区别在于,这种方法使B在继承A的原型方法同时,也继承了C的实例方法;而上面只继承了A的实例方法。
3.借助构造函数继承
同样的,B要继承A(或者同时继承C、D时)的话,可以
function B(){
A.call(this);
C.call(this);
D.call(this);
}
这种方法是在B函数体内部,将A的this指向改变。
这样,在B构造对象时,就会执行这行代码,
特点:
1.只继承了A构造函数的属性,没有继承A原型上的属性。
2.可以继承多个构造函数的属性(call多个)。
3.在B构造的对象里可以向A传参。
缺点:
1.只能继承A构造函数的属性,无法继承原型的属性。
2.无法实现构造函数的复用(每次用B构造对象时,都会调用一遍call这行代码。)
3.每个B实例都会有A构造函数的副本。