js原型继承的几种方法

JavaScript07

js原型继承的几种方法,第1张

利用原型链来实现继承,父类的一个实例作为子类的原型

原理: 子类的原型对象 指向 父类的实例 , 当 子类实例 找不到属性和方法时,会沿着原型链往上找。

优点:简单,既是子类实例也是父类实例,父类新加原型方法或者属性,子类都能访问到

缺点:

通过使用call、apply方法可以在新创建的对象上执行构造函数,用父类的构造函数来增加子类的实例

原理: 子类的构造函数中执行父类的构造函数,并且改变子类的this绑定

优点:简单,直接父类的属性和方法

缺点:无法继承原型链上的属性方法

将父类原型对象直接赋值给子类的构造函数,再将空属性的构造函数实例赋值给子类原型对象

优点:完美实现继承,解决了组合式继承带两份属性的问题; new Child的时候不用 每次都 new Parent

缺点: 子类的prototype添加方法会影响 父类的prototype

将父类原型对象直接赋值给子类的构造函数,再将空属性的构造函数实例赋值给子类原型对象

优点:完美实现继承,解决了组合式继承带两份属性的问题; new Child的时候不用 每次都 new Parent

将等待继承的原型对象克隆,再赋值给继承的原型对象

优点:直接通过对象生成一个继承该对象的对象

缺点:不是类式继承,而是原型式基础,缺少了类的概念

参考: https://www.jb51.cc/note/413574.html

https://blog.csdn.net/qq_42926373/article/details/83149347

继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的。

原型链

首先得要明白什么是原型链,昆明北大青鸟http://www.kmbdqn.cn/建议可以在一篇文章看懂proto和prototype的关系及区别中讲得非常详细

原型链继承基本思想就是让一个原型对象指向另一个类型的实例

添加方法

在给SubType原型添加方法的时候,如果,父类上也有同样的名字,SubType将会覆盖这个方法,达到重新的目的。但是这个方法依然存在于父类中。

记住不能以字面量的形式添加,因为,上面说过通过实例继承本质上就是重写,再使用字面量形式,又是一次重写了,但这次重写没有跟父类有任何关联,所以就会导致原型链截断。

问题

单纯的使用原型链继承,主要问题来自包含引用类型值的原型。

借用构造函数

此方法为了解决原型中包含引用类型值所带来的问题。

这种方法的思想就是在子类构造函数的内部调用父类构造函数,可以借助apply()和call()方法来改变对象的执行上下文

传递参数

借助构造函数还有一个优势就是可以传递参数

第一种方式:js使用构造函数的继承。

缺点:无法继承父类的原型链。

第二种:使用原型链继承的方式

// 缺点:父类的属性为引用类型时候,子类实例众多使用,有一个修改,其它也会变成修改值

第三种 // 使用组合继承的方式。

解决了上面两种缺点。