js继承
JS继承实现方式也很多,主要分ES5和ES6继承的实现
先说一下ES5是如何实现继承的
ES5实现继承主要是基于prototype来实现的
说之前我们先说一下什么是继承 :
通过某种方式可以让一个对象访问另一个对象的属性和方法 这种方式就是继承
敲黑板:实现继承首先要提供一个父类
原型链继承
利用原型让一个引用类型继承另一个引用类型的属性和方法
优点:简单易于实现
缺点:无法向父函数传参,函数不能复用
B.prototype=new A()
借用构造函数继承(call或者apply的方式继承)
在子类型的构造函数中调用超类型构造函数
优点:可以向父函数传参,解决了实例被共享的问题
缺点:无法复用,不能继承原型属性或方法
function B(name,age)
{
A.call(ths,name,age)
}
组合继承 组合继承是结合第一种和第二种方式
特点:可以继承父类原型上的属性,可传参可复用。
缺点:调用了两次父类构造函数(耗内存)。
原型式继承
借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。
优点:不限制调用方式
缺点:无法实现复用,实例会被共享
寄生式继承
创建一个仅用于封装继承过程的函数, 该函数在内部以某种方式来增强对象,最后再像真地是它做了所有工作一 样返回对象。
缺点:不能函数复用故效率低下,实例会被共享
寄生组合式继承
即通过借用构造函数来继承属性 ,通过原型链的混成形式来继承方法,通过寄生的方式来修复组合式继承的不足,完美的实现继承
优点:只调用了一次父函数,效率更高。与其同时,原型链还能保持不变。因此寄生组合继承是引用类型最理性的继承范式。
再说一下ES6是如何实现继承的
ES6继承是目前比较新,并且主流的继承方式,用class定义类,用extends继承类,用super()表示父类
例如:创建A类
class A {
constructor() {
//构造器代码,new时自动执行
}
方法1( ) { //A类的方法 }
方法2( ) { //A类的方法 } }
创建B类并继承A类
class B extends A {
constructor() {
super() //表示父类
}
}
实例化B类: var b1=new B( )
• b1.方法1( )