【面向对象】----【prototype&&__proto__&&实例化对象三者之间的关系】(四)-----【巷子】

一、构造函数面试

a、什么是构造函数?
     解释:经过关键字new 建立的函数叫作构造函数
     做用:用来建立一个对象

废话少说直接上代码,首先咱们仍是建立一个构造函数人类

 

而后咱们在建立两个实例,一个凡尘 一个吴彦祖!毕竟只有咱们2我的的颜值能够进行匹配

 

 

 咱们能够看到凡尘和彦祖都有一个属性name和一个方法eat;那么咱们简单思考一下,由于凡尘和彦祖都是经过构造函数new Person建立出来的,那么他们俩个的eat方法是否相等?

 

打印结果是false.为何会是false? 这个时候就不得不说一个经典的面试题了!!!
 
当建立构造函数的时候js执行了哪些操做?
一、在内存中开辟了一块空间
二、把this指向了当前对象
 
经过这个面试题就可想而知为何不相等了,地址的指向都不相同了还期望他们相同吗?若是还不理解咱们还能够举一个通俗易懂的栗子,假设你和隔壁老王都有一个孩子,大家有一个公共的方法“教育孩子”,你能够想象一个你和隔壁老王的孩子都不在一块儿,俩的教育方法名字虽然相同,可是你能期望老王教育出来的孩子和你教育出来的孩子可以如出一辙?别天真了孩子,要是都同样的话那么这个世界上就没有忠孝礼义廉了
 
那么问题来了咱们如何才能让他们两个的方法都相等呢?也就是说如何才能让他们都调用同一个方法,毕竟每次都调用不一样的方法多么浪费内存!!!!
 
 
 
那么咱们可不能够这样将这个方法写在对象外面让他们调用的这个方法地址执行外面的这个函数?

 

 

貌似能够!!!可是若是要是有多个方法的时候该怎么办?难到我须要在外面定义多个全局函数吗?毕竟咱们主张的是尽可能减少全局变量和全局函数,第一是为了防止变量名的冲突。第二也是为了初学者的词汇量着想 第三也是为了防止变量的污染
 
难到就没有什么完美的解决方案吗?
那下面就不得不说下咱们伟大的原型prototype

 

二、原型prototype函数

1、什么是prototype?
     a、prototype是每个函数自带的一个属性
     b、prototype属性指向一个对象,简称原型。全部prototype称为原型

2、原型有什么做用?
     1、节约内存

     2、扩展属性和方法

     3、能够实现类的继承

三、接下来咱们建立2个函数,来查看函数里面是否有prototype这个属性

从以上例子中咱们能够更加确定每个函数都有一个prototype属性而这个属性指向一个object。若是prototype指向一个对象的话那么咱们天然就能够给它添加属性和方法了this

 

四、如何在prototype原型上面添加属性和方法?spa

 

 

五、由于这个方法是在构造函数Person的原型上添加的,所以当每次实例化一个对象的时候,每一个对象都有这样一个方法,并且都是调用的同一个方法prototype

 

 六、那么接下来咱们看下咱们加在原型上面的这个方法在这个实例化对象的哪里放着。3d

咱们能够清晰的看到咱们实例化出来的对象,这个eat方法在__proto__里面放着,而这个__proto__一样也指向了一个对象。那么咱们就不得不思考下构造函数的prototype与实例化对象里面的__proto__是不是同一个东西code

 

七、构造函数的prototype与实例化__proto__之间的关系对象

不比较不知道,一比较吓一跳。他们不只发现里面的东西相同,并且判断结果也相同。并且你会发现你经过原型prototype添加的方法在__proto__里面也会出现。换句话说也就是__proto__能够访问prototype里面的全部属性和方法blog

 三、prototype--->__proto__---->实例化对象三者之间的关系继承

1、prototype总结

     解释:每个函数都有一个prototype这个属性,而这个属性指向一个对象,咱们简称原型
     
     做用:
          1、节约内存

          2、扩展属性和方法

          3、能够实现类之间的继承

2、__proto__总结
     1、每个对象都有一个__proto__属性

     2、 __proto__指向建立本身的那个构造函数的原型

     3、对象能够直接访问本身__proto__里面的属性和方法

3、constructor总结
     constructor指向建立本身的那个构造函数


接下来咱们说说三者之间的关系。

当咱们建立一个构造函数的时候这个构造函数自带了一个prototype属性,而这个属性指向一个对象,也就是原型对象。这个原型对象里面有一个constructor构造器,它的做用是指向建立本身的构造函数。除此以外prototype还能够存放公共的属性和方法。当咱们实例化一个对象的时候,这个对象自带了一个__proto__属性,这个__proto__指向建立本身的构造函数的原型对象。可使用这个原型对象里面的属性和方法。那么接下来咱们用一个栗子和内存图来表示

相关文章
相关标签/搜索