new
手写new操作符
js
function myNew(constructor, ...args) {
const obj = Object.create(constructor.prototype)
const result = constructor.apply(obj, args)
return result !== null && typeof result === 'object' ? result : obj
}
let flag = undefined
function Person(name, age) {
this.name = name
this.age = age
flag = this
}
const p = myNew(Person, 'xiaoming', 20)
console.log(p.name) // xiaoming
console.log(p instanceof Person) // true
console.log(flag === p) // true- 在内存中创建一个空对象(例如(
{}) - 将这个新对象的
__proto__指向构造函数的prototype属性。这一步确保示例可以访问构造函数原型上的方法 - 执行构造函数,同时将函数内部
this绑定到这个新对象上。此时,构造函数的this.xxx = yyy开始为新对象赋值 - 如果构造函数返回了一个非空对象,则返回该对象;否则,默认返回第一步创建的对象