三种继承方式:
原型链继承:
将父类的实例作为子类的原型,父类的属性包括新增属性子类都可以访问到,
此种继承优点:
1.构造简单,实例是子类的实例,也是父类的实例。
2.子类能访问到父类的属性包括新增属性(上面有提到)
缺点:
1,无法实现多继承
2.书写麻烦,新增的属性必须在 new parent() 实例后面添加,不能放在构造器里面添加。
3.创建子类实例时,无法向父类构造函数传参。
构造继承:
使用.call继承父类(复制父类)的属性方法到子类。
优点:1.使用.call可继承多个父类,实现多继承。
2.创建子类实例时,可像父类传递参数(因为子类继承到了父类的属性方法了,自然也可以通过子类实例传递参数)。
3.解决了原型链继承中,子类实例共享父类引用属性的问题。
组合继承:
核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用.
优点:
1.弥补了方式2的缺陷,可以继承实例属性/方法,也可以继承原型属性/方法
2.既是子类的实例,也是父类的实例
3.不存在引用属性共享问题
4,.可传参
5.函数可复用
缺点:调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)
.call 和 .apply 的
区别:
传参不同:fun.call(thisobj,arg1,arg2)针对确定的参数,使用.call,参数使用逗号分隔。
fun.apply(thisobj,[arg1,arg2])针对不确定的参数,使用.apply传递,参数用数组形式传递。
作用:
改变this指向,.call和.apply的this默认指向当前函数,第一个参数传入将会把默认的this指向给替换掉,将this指向改变为第一个参数(比如对象);
image.png
网友评论