JavaScript - New之后发生了什么?

#new

new运算符允许开发人员创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

  • 1、创建一个 空对象 ,作为将要返回的对象实例
  • 2、将这个空对象的原型,指向了构造函数的 prototype 对象
  • 3、将函数的 this 指向这个空对象,执行构造函数的代码(为这个新对象添加属性)
  • 4、判断函数的返回值类型。

具体实现

new
javascript
12345678910
function myNew(Func, ...args) {
// 1.创建一个新对象
const obj = {}
// 2.新对象原型指向构造函数原型对象
obj.__proto__ = Func.prototype
// 3.将构建函数的this指向新对象
let result = Func.apply(obj, args)
// 4.根据返回值判断
return result instanceof Object ? result : obj
}

测试如下

一个栗子
javascript
123456789
function Person(name) {
this.name = name
}
const p1 = new Person('p1')
const p2 = myNew(Person, 'p2')
console.log('p1', p1 instanceof Person) // -> true
console.log('p2', p2 instanceof Person) // -> true