new 的过程可以拆成四步:第一步创建一个空对象;第二步把空对象的原型指向构造函数的 prototype,建立原型链;第三步把构造函数的 this 绑定到新对象上并执行,完成属性赋值;第四步判断构造函数返回值,如果返回值是对象就用它,否则返回新对象。
面试官常要求手写 new 的实现。答题时先讲清四步流程,再写代码:函数内部先判空、设置原型、执行并判断返回。延伸考点是构造函数显式 return 一个新对象时,new 出来的实例会被替换;以及 ES6 的 class 写法本质上仍是这套机制。
// 手写 new function myNew(Ctor, ...args) { if (typeof Ctor !== 'function') throw new TypeError('Ctor must be a function'); const obj = Object.create(Ctor.prototype); const ret = Ctor.apply(obj, args); return ret instanceof Object ? ret : obj; } function Person(name) { this.name = name; } Person.prototype.say = function () { return 'hi ' + this.name; }; const p = myNew(Person, 'Tom'); console.log(p.name, p.say(), p instanceof Person); // Tom hi Tom true