手写代码系列之New(fn)
乔文飞 Lv8

New操作符做了哪些事

  • 创建了一个全新的对象。
  • 会被执行[[Prototype]](也就是proto)链接。
  • 使this指向新创建的对象。
  • 通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。
  • 如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用将返回该对象引用。

实现

  • 版本一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function myNew(fn){
    return function(){
    // 创建一个对象,且将其隐式原型指向构造函数原型
    let obj = {
    __proto__: fn.prototype
    }
    // 执行构造函数
    fn.call(obj, ...arguments)
    // 返回该对象
    return obj
    }
    }

    // 使用示例:
    function Person(name, age){
    this.name = name
    this.age = age
    }
    let obj = myNew(Person)('chen', 18)
  • 版本二:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function myNew(fn){
    let res = {};
    if(fn.prototype !==null){
    res.__proto__ = fn.prototype;
    }
    let ret = fn.apply(res, Array.prototype.slice.call(arguments, 1));
    if(typeof ret === "object" || typeof ret === "function") && ret !== null{
    return ret
    }
    return res
    }
    // 使用示例:
    function A() {}
    var obj = New(A, 1, 2);
    // equals to
    var obj = new A(1, 2);
  • 本文标题:手写代码系列之New(fn)
  • 本文作者:乔文飞
  • 创建时间:2021-03-17 08:46:47
  • 本文链接:http://www.feidom.com/2021/03/17/手写代码系列之New-fn/
  • 版权声明:本博客所有文章为作者学习笔记,有转载其他前端大佬的文章。转载时请注明出处。