# 题目描述

请你完成一个函数_new 要求实现new操作符的功能。

# 测试用例

function test() {
  const Fn = function () {};
  const o = _new(Fn);
  const result = o.__proto__ === Fn.prototype;
  return result;
}
// true
1
2
3
4
5
6
7

# 思路

根据题目要求,实现一个仿new功能的新"_new"函数,该函数会返回一个对象,该对象的构造函数为函数参数、原型对象为函数参数的原型,核心步骤有:

  • 创建一个新对象
  • 获取函数参数
  • 将新对象的原型对象和函数参数的原型连接起来
  • 将新对象和参数传给构造器执行
  • 如果构造器返回的不是对象,那么就返回第一个新对象

# 代码实现

const _new = function () {
  // 补全代码
  let obj1 = {}; // 创建空对象
  // 获取函数参数
  const fn = [...arguments].shift();
  // 将新对象的原型对象和函数参数的原型连接起来
  obj1.__proto__ = fn.prototype;
  // 将新对象和参数传给构造器执行
  const obj2 = fn.apply(obj1, arguments);
  // 如果构造器返回的不是对象,那么就返回第一个新对象
  return obj2 instanceof Object ? obj2 : obj1;
};

1
2
3
4
5
6
7
8
9
10
11
12
13