01-原形链模式

原形链查找机制:

首先找当前实例的私有属性,如果私有中存在,找的就是私有的,如果私有中不存在,默认根据__proto__找所属类prototype上公有的属性,公有中有的话就是公有的,如果公有也没有,则继续根据__proto__在往上一级找....直到找到Object这个基类的prototype为止,如果基类上也没有,则代表当前实例没有这个属性,返回的结果是undefined
 
特性1:
  1. 当前的实例不仅可以通过__proto__查找,还可以修改原型上公有属性和方法
  2. 我们还可以直接的通过当前类的prototype修改原型上的公有的属性和方法
  3. 实例直接的在自己的私有属性中增加c,其余的实例是不受影响的
  4. 在所有IE浏览器中,浏览器为了保护类的原型,屏蔽了__proto__的使用

特性2:

  1. 每一个对象(实例也是对象)都有一个天生自带的属性:__proto__,这个属性指向当前所属类的原型
  2. 每一个函数(类也是函数)都有一个天生自带的属性:prototype(原型),并且这个属性存储的值是一个对象数据类型的数据,浏览器默认给这个属性开辟一个堆内存在这个堆内存中存储了相关的属性和方法
    • 其中constructor就是天生自带的一个属性,constructor等于当前的函数本身
    • __proto__:prototype对应的值也是一个对象数据类型的值,所以也天生自带__proto__这个属性
    • 我们手动通过__proto__添加的属性和方法:这部分属于当前类的公有属性和方法
 

 
手动重新赋值的prototype原型地址,就不指向原来浏览器默认开辟的堆内存空间,而是指向自己赋值的这块内存空间,也是一个对象。也有自己的__proto__,最终也会指向Object的prototype。
原来默认开辟的那个因为没人指向他了,处于无用状态,就会被销毁。
但是只有浏览器默认开辟的内存地址才有constructor属性,新的内存空间需要自己指定constructor指向原来的那个函数。否则就会沿着往上查找,constructor就指向了Objec。

 

 

 

 
 
原文地址:https://www.cnblogs.com/haoqiyouyu/p/14466653.html