Javascript的继承

其他的OO语言继承都有两种方式:实现继承,签名继承。JS因为函数没有签名所以JS只有实现继承。

一、原型链继承

原理:让子类的原型指向父类的实例

优点/特点:

1、非常纯粹的继承关系,实例是子类的实例,也是父类的实例

2、简单容易实现

3、父类的原型上新增属性和方法子类都可以访问到

缺点:

1、继承单一,无法实现多继承

2、新实例无法向父类传递参数

3、想要修改子类的原型必须在Son.prototype=new Parent()之后,否则无效。

4、所有新实例都会共享父类实例的属性

5、引用类型属性会存在子类更改了父类的,其他子类会受到影响

 

二、借用构造函数继承

原理:在子类内部调用父类,利用函数.call和apply改变this指向

特点/优点:

1、子类可以向父类传递参数

2、可以实现多继承

3、所有子类不会共享父类的属性

缺点:

1、无法实现父类的方法共享

2、无法继承父类原型上的方法和属性

3、实例不是父类的实例,是子类的实例

 

三、组合继承(原型链继承和借用构造函数接触组合)

原理:使用借用构造函数继承父类的属性,使用原型链方式继承父类的方法

优点/特点:每个新实例的构造函数上的属性都是私有的,方法实现共享

缺点:小瑕疵,调用了两次父类的构造函数(耗内存)

 

四、原型式继承

 

 

原理:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。object.create()就是这个原理

优点/特点:

1、不限制调用方式

2、简单,易实现

3、父类必须是一个对象

缺点:

1、新的实例没有用new构建出来

2、子类的属性没有私有化,某个子类更改以后会影响父类和其他子类(引用类型更不用说)

 

五、寄生式继承

 

 

原理:就是在原型式继承上面套了一层壳

特点/优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象。

缺点:没用到原型,无法复用。

 

六、组合寄生式继承(目前最完美的继承方式)

原理:利用寄生式继承解决了组合继承调用了两次父类构造函数的小瑕疵。

这是目前最完美的继承方式,es6的继承就是根据这个继承方式来的

 

七、ES6的继承方式

用法:构造函数必须使用class关键字创建,用关键字extends实现继承,在子类中必须使用super(),要向父类传递参数需要在这个函数里传递就可以了

ES6的继承原理是跟ES5的寄生式组合继承差不多,只是实现的方式不太一样,感兴趣的同学可以去看看ES6继承的实现原理

posted @ 2020-06-02 14:25  菜鸡前端  阅读(30)  评论(0)    收藏  举报