对象的继承

对象的继承

一、原型链继承

对象的继承
对象的继承
对象的继承
可以看到我们在控制台打印一个数组,可以看到数组的原型是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方法,那还是不能满足我们的需求啊。
也就是说构造函数继承存在:没办法拿到原型上的方法的问题

三、组合继承

上面两种继承方式都有问题,那我们是不是可以将它们结合一下。
对象的继承
对象的继承

上一篇:Python - 面向对象编程 - 使用 super() 的一些注意事项


下一篇:super关键字