js编程-原型和原型链

91 阅读1分钟

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 合并俩个对象(浅比较)。