- 创建一个空对象,这个对象将作为执行构造函数后返回的实例对象。
- 将新创建的对象的原型__proto__指向构造函数的prototype的对象。
- 将这个空对象赋值给构造函数的
this
,并执行构造函数。 - 根据构造函数执行逻辑,返回第一步创建的对象或构造函数的显示的返回值。
因为new
是javascript
的关键字, 不能进行覆盖,采用newFunc
进行模拟实现。
function newFunc(...args) {
// 取出args数组的第一个参数,即构造函数
const constructor = args.shift()
// 创建一个空对象,且这个空对象继承构造的 prototype 的属性
const obj = Object.create(constructor.prototype)
// 执行构造函数,得到构造函数的返回结果
// 注意,这里使用 apply 使构造函数内部内部的 this 指向 obj
const result = constructor.apply(obj, args)
// 如果构造函数执行后,返回结果时对象类型,则直接将该结果返回,否则返回 obj 对象
return (typeof result === 'object' && typeof result !== null) ? result : obj;
}
newFunc
使用方式如下,
function Person(name) {
this.name = name
}
const p = newFunc(Person, 'test')
console.log('p', p)
// { name: 'test' }
构造函数有显示返回值,且返回值为对象类型,那么构造函数返回结果就不再是实例目标了。
function Person(name) {
this.name = name
return { 1: 1 }
}
const p = newFunc(Person, 'test')
console.log('p', p)
// { 1: 1 }