实现 new 运算符

作者: lio_zero | 来源:发表于2021-04-29 16:17 被阅读0次

    new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一

    原理

    MDN 对 new 解释的操作步骤如下:

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

    考虑返回值

    • 假如构造函数有返回值且是对象,返回这个对象
    • 假如构造函数有返回值且不是对象,返回创建的空对象
    • 假如构造函数没有返回值,返回创建的空对象

    实现

    function myNew() {
      let obj = {}
      let Constructor = [].shift.call(arguments)
      obj.__proto__ = Constructor.prototype
      let ret = Constructor.apply(obj, arguments)
      return typeof ret === 'object' ? ret : obj
    }
    

    示例:

    function Person(name, age) {
        this.name = name
        this.age = age
    }
    let p = myNew(Person, 'O.O', 20)
    console.log(p)  // { name: 'O.O', age: 20 }
    

    扩展:可以使用 new 一个箭头函数吗?

    箭头函数没有 prototype、没有自己的 this 指向、不可以使用 arguments、自然不可以 new

    更多资料

    第 14 题:情人节福利题,如何实现一个 new

    相关文章

      网友评论

        本文标题:实现 new 运算符

        本文链接:https://www.haomeiwen.com/subject/nzjnlltx.html