mynew函数正确模拟new的四步逻辑:创建空对象、绑定prototype到__proto__、apply执行构造函数、按规则返回对象或实例。

要手写实现一个模拟 new 运算符行为的函数,核心是还原 JavaScript 中构造函数调用时的四步逻辑:创建空对象、绑定原型、执行构造函数、返回正确结果。
关键四步必须都覆盖
原生 new 的行为可拆解为:
- 创建一个全新的空对象(即实例)
- 将该对象的
__proto__指向构造函数的prototype - 以这个新对象为
this,调用构造函数,并传入参数 - 若构造函数显式返回一个「对象类型」值,则返回它;否则返回新创建的对象
基础实现(支持普通构造函数)
下面是一个简洁可靠的实现:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
function myNew(constructor, ...args) {
// 1. 创建空对象
const obj = {};
// 2. 链接原型(关键:obj.__proto__ = constructor.prototype)
obj.__proto__ = constructor.prototype;
// 3. 执行构造函数,绑定 this 并传参
const result = constructor.apply(obj, args);
// 4. 判断返回值:如果是对象或函数,就返回它;否则返回 obj
return (result !== null && typeof result === 'object') || typeof result === 'function'
? result
: obj;
}
注意原型链接的写法
不能写成 Object.setPrototypeOf(obj, constructor.prototype) 或 obj.constructor = constructor —— 前者性能略低(虽可用),后者完全无效(constructor 属性不控制原型链)。真正起作用的是 __proto__(或标准写法 Object.setPrototypeOf),但直接赋值 __proto__ 最直观且兼容性足够(现代环境均支持)。
验证是否生效
可以这样测试:
function Person(name) {
this.name = name;
}
Person.prototype.say = function() { return 'Hi ' + this.name; };
const p = myNew(Person, 'Alice');
console.log(p.name); // 'Alice'
console.log(p.say()); // 'Hi Alice'
console.log(p instanceof Person); // true(因为原型链正确)
如果构造函数返回对象,比如 return { age: 25 },那么 myNew 也会返回该对象,而不是默认实例——这和原生 new 行为一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










