对象的继承

2021/9/6 6:10:21

本文主要是介绍对象的继承,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

对象的继承

一、原型链继承

对象的继承
在这里插入图片描述
在这里插入图片描述
可以看到我们在控制台打印一个数组,可以看到数组的原型是Array,而Array也有一个原型是Object。也就是说存在着一下的这个关系。

[]->Array.prototype->Object.prototype
数组是可以拿到这条链上的方法来用的。

像数组的 [].map()和Object上的toString()方法都能用。

那现在有以下代码:

在这里插入图片描述
我们知道,实例可以继承自身原型上的实例和方法,那我现在想要Sub的实例sub1继承Super上的方法该怎么做呢?

我们知道实例可以访问自身的原型,那我们是不是也可以把Sub的原型成为Super的实例呢?

Sub.prototype = new Super()
在这里插入图片描述
这样是不是就将他们串起来了。

那到底拿不拿得到呢
在这里插入图片描述

在这里插入图片描述

显然已经拿到了,这就是原型链继承。

那这种继承方式有没有问题呢?在这里插入图片描述

我们又创建了一个Sub的实例sub2,通过sub1改掉a的值看又没有问题。
在这里插入图片描述
这样看好像没什么问题。那换成数组呢?
在这里插入图片描述
在这里插入图片描述
哎,我靠。按常理应该只要sub1会改才对啊,为什么sub2也会改了呢?这就是有问题啊。
以上证明原型链继承会存在:引用值共享的问题

二、构造函数继承

我们Sub想要继承Super上的值要怎么做呢?
最简单的方法是不是将Super上的值复制到Sub中就可以实现了。
在这里插入图片描述
那要怎么拿呢?

要拿到Super的值是不是相当Super执行了一遍。
在这里插入图片描述
这样就可以拿到了吗?
这里我们可以看到,Super();是独立执行的,那么它的this指向是不是指向了全局。
在这里插入图片描述

在这里插入图片描述
可以看到控制台打印了两次window。

我们希望的是什么呢?我们希望在调用Super的时候this指向指向Sub的实例。
在这里插入图片描述
也就是说上面的this要修改为下面的this,要和new后的this指向一样。
我们可以通过call()强绑定的方法修改。
在这里插入图片描述
那这样行不行呢?

在这里插入图片描述
在这里插入图片描述
哎,成功了。
这就是构造函数继承,它解决的引用值共享的问题。
那它有没有问题呢?
在这里插入图片描述
在这里插入图片描述
调用了一下say方法发现报错了!!!因为Sub上根本没有say方法,那还是不能满足我们的需求啊。
也就是说构造函数继承存在:没办法拿到原型上的方法的问题

三、组合继承

上面两种继承方式都有问题,那我们是不是可以将它们结合一下。
在这里插入图片描述
在这里插入图片描述



这篇关于对象的继承的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程