Day05-new做了4件事,构造函数有返回值怎么处理?

83 阅读2分钟

new Person()

  • 1、创建一个空对象obj
  • 2、继承,让这个空对象的__proto__ 等于Person.prototype
  • 3、执行构造函数,this绑定这个空对象,得到返回值res
  • 4、返回:res是引用类型,就返回res,否则是基础数据类型,就返回obj
    • 基础类型返回空对象obj
    • 引用类型返回引用类型res

创造一个全新的对象 这个对象会被执行 [[Prototype]] 连接,将这个新对象的 [[Prototype]] 链接到这个构造函数.prototype 所指向的对象 这个新对象会绑定到函数调用的 this 如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象

模拟代码:

function myNew(fn, ...args) {  
  // 1、创建一个空对象  
  const obj = {};  
  // 2、将该对象的 __proto__ 属性链接到构造函数原型对象  
  obj.__proto__ = fn.prototype;  
  // 3、将该对象作为 this 上下文调用构造函数并接收返回值  
  const res = fn.apply(obj, args);  
  // 4、如果返回值存在并且是引用数据类型,返回构造函数返回值,否则返回创建的对象  
  return typeof res === "object" ? res : obj; 
} 

const c = myNew(Person, "b"); c.say();

追问: new 一个添加了bind的构造函数,实例会继承bind绑定的对象吗?

  • 不会\
  • bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()中的第一个参数的值,例如:f.bind(obj),实际上可以理解为obj.f(),这时f函数体内的this自然指向的是obj。\
  • new方法绑定优先级高于bind,他会重新生成一个新的干净的实例。\
  • this 绑定四大规则,优先级排序为 new > 显示 > 隐式 > 默认\
    • 默认绑定(非严格模式下this执向window,严格模式指向空对象{})\
    • 隐式绑定(类似setTimeout以及对象内非箭头函数中,this都是指向window)\
    • 显示绑定(call, apply, bind)\
    • new 绑定