# 题目描述
请你完成一个函数_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
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
2
3
4
5
6
7
8
9
10
11
12
13