new手写实现

new手写实现


javascript 手写实现 构造函数
<!DOCTYPE html>
<html>
  <head>
    <title>New</title>
    <script type="text/javascript">
      //手写一个new操作符
      //它创建了一个全新的对象。
      //它会被执行[[Prototype]](也就是__proto__)链接。
      //它使this指向新创建的对象。。
      //通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。
      //如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用将返回该对象引用
      function New(fn) {
        let res = {};
        if (fn.prototype !== null) {
          res.__proto__ = fn.prototype;
        }
        let ret = fn.apply(res, [...arguments].slice(1));
        // 下面这个判断是因为构造函数中如果return了一个非基本数据类型,则new出来的结果就是这个return的对象,this会被丢弃
        if (
          (typeof ret === "object" || typeof ret === "function") &&
          ret !== null
        ) {
          return ret;
        }
        return res;
      }

      function A(name, age) {
        this.name = name;
        this.age = age;
      }

      let obj = New(A, "Niko", 25);

      let obj2 = new A("Niko", 25);

      console.log(obj);

      console.log(obj2);
    </script>
  </head>
  <body></body>
</html>
© 2025 Niko Xie