剖析:箭头函数不能被当做构造函数,不能使用new关键字构造实例对象

108 阅读1分钟

积跬步,至千里。

new的原理

  • 原理解析 new关键字创建实例的过程:
    1. 创建一个新的空对象
    2. 将新的空对象的__proto__属性指向原构造函数的prototype
    3. 改变this,指向新的空对象,执行函数并将结果保存
    4. 判断函数执行结果有没有返回值对象,如果有则返回该结果,若没有返回新的空对象
  • 结合实例
function NewObj(fn) {
    // 创建一个新的空对象
    const obj = {}
    // 将新对象的__proto__属性指向原构造函数函数的property
    obj.__proto__ = fn.prototype
    // 改变this指向,指向obj,并执行保存结果
    const res = fn.call(obj)
    // 判断执行结果是否返回其他对象
    if (typeof res === 'function' || typeof res === 'object') {
        return res    
    }
    return obj
}

箭头函数不可以使用new

  • 剖析

    箭头函数与普通函数相比,其没有prototype、没有自己的this指向、不可以使用arguments

  • 原因

    1. 箭头函数没有prototype属性,而new内部需要调用原函数的prototype属性
    2. new内部有改变this指向的操作,但是call()bind()apply()对箭头函数没有作用。箭头函数的this是定义时所在的对象,而不是使用时所在的对象,无法改变