new操作符具体做了什么?

83 阅读1分钟

new是什么

在javaScript中, new操作符用于创建一个给定构造函数的实例对象。

注意: 构造函数中如果有显示的返回值:

  • 返回原始值,无用,this依然指向实例对象,
  • 返回一个对象,this指向这个对象

如下:

function Test(name) {
    this.name = name
    return 1
}

const t = new Test('xxx')
console.log(t.name) // 'xxx'

function Test(name) {
    this.name = name
    console.log(this) // Test { name: 'xxx' }
    return { age: 26 }
}

const t = new Test('xxx')
console.log(t) // { age: 26 }
console.log(t.name) // 'undefined'

new操作符做了什么

  1. 在堆内存中开辟一个空间,创建一个新空对象
  2. 把这个空对象的原型(proto)和构造函数的原型对象(constructor.prototype)连接
  3. 构造函数中的this指向这个空对象
  4. 执行构造函数方法,属性和方法被添加到this引用的对象中
  5. 如果构造函数中没有返回其它对象,那么返回this,即创建的这个的新对象,否则,返回构造函数中返回的对象。

image.png

手写new操作符

function _new(constructor, ...args){
    // 创建的新对象
    const obj = {};   
    
    // 执行[[原型]]连接, obj是constructor的实例
    obj.__proto__ = constructor.prototype;
    
    // 执行构造函数,将属性或方法添加到创建的空对象上
    let result = constructor.apply(obj, args);
    
    //如果构造函数执行的结构返回的是一个对象,那么返回这个对象
    //如果构造函数返回的不是一个对象,返回创建的对象
    
    return result instanceof Object ? result : obj
}

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.say = function () {
    console.log(this.name)
}

let p = _new(Person, "huihui", 123)

console.log(p) // Person {name: "huihui", age: 123}

p.say() // huihui