阅读 240

new()和create()的原理,区别和实现

原型,构造函数 ,和实例的关系

开始探究new()和create()前 先整理下 原型,构造函数 ,和实例的关系

  • 实例=new 构造函数()
  • 实例.prototype 指向原型
  • 构造函数的.prototype 指向原型;
  • 原型的本质是一个对象
  • 实例.prototype===构造函数的.prototype 指向原型;
  • 原型.constructor指向构造函数
  • 实例.constructor也指向构造函数因为实例自己没有此属性,会去找原型的相关属性,也就指向构造函数,
  • 构造函数的prototype在不指向的情况下指向Object,Object的prototype指向null
  • 原型也可能有自己的原型,那么就形成了原型链,实例在查询某个属性时 会沿着原型链逐级向上查找直到找到目标属性(这就是继承)

new

new的使用

function A (){}
const a=new A()
复制代码

new的原理

  1. 创建一个空对象
  2. 空对象的__proto__属性指向构造函数的prototype属性 指向同一个原型

new的实现

const a={}
a.__proto__=A.proptotype
复制代码

单纯的原型链继承弊端

  • 原型的属性是被所有实例共享的(继承的弊端),会存在实例篡改属性问题

其他的继承方式----待更新

ceate

ceate的使用

const obj=Object.create(func)
复制代码

ceate的原理

  1. ceate方法里创建一个对象(构造函数)
  2. 对象的 prototype属性指向,ceate方法的人参
  3. 返回 该对象的实例

ceate的实现

function create(prpto){
  function Fn(){}
  Fn.prototype=proto;
  return new Fn()
}
复制代码

new和 ceate的区别

  • new 实例化的对象原型指向的是构造函数的原型
  • create生成的对象的原型指向的是 Object.create(proto) 的入参
文章分类
前端
文章标签