Js中面向对象的底层处理机制:
1、每一个除箭头函数外的函数数据类型(普通函数、生成器函数、构造函数、内置类【内置类构造函数】),都天生自带属性prototype(原型属性),属性值是一个对象(Function.prototype除外),并且原型对象中自带一个属性constructor,属性值是当前构造函数本身。
作用:存储当前类所属实例的公共属性和方法;
prototype 针对类有用,普通函数没啥用
2、每一个对象数据类型值(普通对象、数组对象、正则对象、日期对象..... 原型对象、实例对象、函数)都天生自带一个属性:proto(原型链属性--隐式原型),属性值指向所属类的的原型对象prototype.
作用:为了找到所属类原型上的公共方法和属性。
原型链:
原型链是一种查找机制,成员访问时,先找自己的私有属性,如果有,就停止,否则就默认基于__proto__找所属类的prototype上的,如果找不到,则基于prototype上的__proto__继续向上找,直到找到Object.prototype为止。
构造函数的“原型重定向”
优势:
-
把原型上为其实例提供的公共属性和方法,全部写在一起,提高整体性后者模块性;
-
向其原型上扩展方法容易一些
弊端:
-
重定向后的原型对象中缺失constructor属性;解决方法: 手动添加constructor属性,保证结构完整性
-
如果原始内置的原型对象中具备了一些属性和方法,此时重定向之后,之气设置的公共属性和方法丢失了 解决方案: fn.prototype = Object.assign(fn.prototype, {.....})
Object.assign 合并俩个对象(浅比较)。