001原型链
什么是原型链? 解释:由__proto__形成的链条叫做原型链 假设我们创建了一个Person这个构造函数,然后实例化出一个对象fanchen,当我们输出这个实例化对象的时候,这个实例化对象里面有一个__proto__属性,这个__proto__属性指向的是创建自己的那个构造函数的原型,也就是说这个实例化对象的__proto__指向的是Person里面的prototype这个原型对象,因为prototype是一个对象因此里面肯定也会有一个__proto__。而这个__proto__指向的是创建Person这个构造函数的对象,可以想象一下谁创建了Person?这个时候我们就不得不说一句"万物皆是对象".肯定是一个对象创建了Person。而这个对象就是 Function。有对象那么肯定就会有__proto__.那么我们可以想象一下还有什么可以创建出来对象吗?因此对象的顶端也就是null.接下来我们用案例和内存图详细的解释一波
002方法继承
继承: 在上一章我们说了属性继承,接下来我们继续说下方法继承。方法的继承分为好多种,接下来我们逐个分析来找出一种最完美的继承方式 首先我们还是回顾一下属性继承,我们先写一个构造函数Person。然后再创建1个实例化对象fanchen
现在我们可以继承到父级的属性了,但是貌似父级的方法继承不了,因为我看到__proto__里面只有一个work这个方法。那么我们如何继承父级的方法呢?我们可以试想一样fanchen是如何访问到work这个方法的?因为实例化对象里面的__proto__指向是创建自己的那个构造函数的原型对象因此可以访问。那么如果现在我用Man的原型对象指向Person的原型对象会发生什么?
1、原型继承
Man的原型对象指向Person的原型对象
貌似是可以的,但是这个原理是什么呢?同时注意一下上面的constructor的指向。接下来我们画一个内存图来解释一下原理和弊端。
从上面的内存图中我们不难看出当Man的原型指向Person的原型的时候首先Man的原型对象断掉了,随后我们又给Man的原型添加了方法work,这个时候你会发现Man的work方法加到了Person身上。这样肯定是不行的,因为我们怎么能修改父级的原型对象呢?顺便我们可以在打印出来父级的原型看一下
2、原型拷贝
上面的方法肯定不是特别合理的,那么我们可以想一下既然不能直接将Man的原型指向Person的原型,那么我们可不可将Person里面原型对象的属性直接拷贝一份,这样我就不会直接修改到父级的原型了? 废话少说直接上代码
貌似特别完美,接下来我们在查看一下父级有没有发生改变
真的没有什么问题啊。那么接下来我们通过内存图来查看下原理及缺点
3、原型链继承
从上一章我们讲的原型链可以知道,我们可以通过原型链访问父级以及父父级里面的一些属性和方法,那么我们利用这个特点可以将Man的原型对象指向Person的一个实例.因为实例里面肯定是有一个__proto__,这样的话我们就形成了一个原型链。接下来我们用案例和内存图来表示
当打印出来的时候确实可以看到父级的方法也可以进行访问,但是有缺点,大家不难发现Man的__proto__里面多了几个age name sex 而且值还是undefined?
4、混合继承
从上面的原型链继承可以看出,当打印出来fanchen的时候我们丢失了一个constructor属性而且还有好多杂乱的属性,那么我们应该如何解决呢?我们一步一步来
这时候你就会发现终于实现了完美继承。
5、寄生继承
在网上会经常见到一种方法叫做寄生继承。其实看到名字你也能想的到,一定需要一个类似寄生器一样的东西。其实就是一个中间函数
【面向对象】用大白话扯扯那"神奇"的面向对象之方法继承(五)(转载自我的老师 Alley-巷子)
原文:https://www.cnblogs.com/mp-0518/p/11440520.html