箭头函数和普通函数的区别

  1. 箭头函数是匿名函数,不能作为构造函数,不能使用 new
  2. 箭头函数不绑定 arguments,取而代之用 rest 参数…解决
  3. 箭头函数没有原型属性
  4. 箭头函数不绑定 this,会捕获其所在的上下文的 this 值,作为自己的 this 值
  5. 箭头函数不能当做 Generator 函数,不能使用 yield 关键字

首先我们需要知道如何 new 出来一个实例(对象类型的实例或者构造函数的实例)

  • new 关键字 会进行如下的操作:

    1. 创建一个空的简单 JavaScript 对象;
    2. 链接该对象到另一个对象;
    3. 将步骤 1 新创建的对象作为 this 的上下文;
    4. 如果该函数没有返回对象,则返回 this。

    new 的本质是生成一个新对象,将对象的_proto_指向函数的 prototype,再执行 call 方法 普通构造函数通过 new 实例化对象时 this 指向实例对象,而箭头函数没有自己的 this 值,用 call()或者 apply()调用箭头函数时,无法对 this 进行绑定 箭头函数没有 prototype 属性 ,不能作为构造函数,否则 new 命令在执行时无法将构造函数的 prototype 赋值给新的对象的 proto

手动实现一个 New 函数

function New(fc) {
    let newObj = {}
    if(fc.prototype !== null) {
        newObj.__proto__ = fc.prototype
    }
    let res = fc.apply(newObj, Array.prototype.slice.call(arguments, 1))
    // console.log(res)
    if((typeof res === 'object' || typeof res === 'function') && res !== null) {
        return res
    }
    return newObj
}
function A(){
    return 1
}

console.log(New(A))
// 等价于
console.log(new A())