一次性让你彻底搞懂new在做什么

124 阅读2分钟

前言

在很多编程的语言里都有new这个关键字,今天我们就来讨论讨论在JS里面new关键字的作用,并且自己手动实现一个myNew.

何为new?

在JS里new关键字用来创建用户定义的对象类型的实例或者具有构造函数的内置对象类型的实例。总之,new就是创建一个实例的,创建的实例具有构造函数上面的属性和方法。

在使用new过程中,new主要进行了以下操作:

  1. 创建一个空对象,这是最基本的要求,因为我们返回的是一个实例。
  2. 设置原型:将空对象的内部原型[[prototype]]设置为构造函数的prototype属性,可以通过__proto__进行访问,这意味着新对象将继承构造函数原型上的所有属性和方法。
  3. 绑定this并执行构造函数:new调用构造函数并把this关键字绑定到新创建的对象上。在构造函数的内部,可以使用this来引用新创建的对象,并为其添加属性和方法。new调用构造函数相当于执行函数,并且函数内部隐式返回this对象给空对象。
  4. 返回对象:如果构造函数没有显示返回一个对象(即返回undefined或null),则new表达式自动返回新创建的对对象。如果构造函数返回了个对象,则new表达式返回的就不是新创建的对象而是这个对象,此时new关键字就相当于失效了,等于普通函数的调用效果。

根据上面new操作的流程步骤就是我们手写myNew的关键,按照上面流程来做就能写出myNew了。

myNew

function myNew(constructor,...args){
    // 1. 创建一个新的空对象
    let obj={}
    // 2. 把新对象的__proto__ 指向构造函数的prototype对象上
    obj.__proto__=constructor.prototype
    // 3. 绑定this并执行构造函数
    let res=constructor.apply(obj,args)
    // 4. 如果构造函数返回一个对象,那么就返回该对象,否则返回新创建的对象
    return typeof res==='object'&&res!==null?res:obj
}

Ending

以上内容就是手撕new的步骤了,还是比较容易实现的。