模拟实现new关键字功能

Mr.Hotsuitor2020年11月23日小于 1 分钟javascriptnew面试

模拟实现new关键字功能

在js中new关键字主要做了: 首先创建一个空对象,这个对象会作为执行new构造函数之后返回的对象实例, 将创建的空对象原型(__proto__)指向构造函数的prototype属性,同时将这个空对象赋值给构造函数内部的this,并执行构造函数逻辑,根据构造函数的执行逻辑,返回初始创建的对象或构造函数的显式返回值。

/*
 * File Created: Tuesday, 14th March 2023 5:02:13 pm
 * Author: hotsuitor (hotsuitor@qq.com)
 * -----
 * Last Modified: Tuesday, 14th March 2023 5:08:14 pm
 * Modified By: hotsuitor (hotsuitor@qq.com>)
 */

function newFn(...args) {
  // 获取第一个参数,要new的函数
  const constructor = args.shift()
  // 创建一个空的对象,将实例化对象的原型指向构造函数的原型对象
  const obj = Object.create(constructor.prototype)
  // 修改this指向空对象,传入参数
  const result = constructor.apply(obj, args)
  // 判断返回值,如果函数返回值为基本数据类型时, 则new出的对象依然是创建出的对象
  return result instanceof Object ? result : obj
}

function Person(name) {
  this.name = name
}

let p1 = newFn(Person, 'Lisa')
let p2 = newFn(Person, 'Jery')
console.log(p1.name) // Lisa
console.log(p2.name) // Jery