Skip to content

new 操作符新建了一个空对象,这个对象原型指向构造函数的 prototype,执行构造函数后返回这个对象

  1. 创建一个空的对象{}
  2. 链接到原型(将空对象的原型 prototype 指向构造函数的原型)
  3. 绑定 this 指向,执行构造函数
  4. 对构造函数有返回值的判断

<!-- more -->

实现

  1. 让实例可以访问到私有属性
  2. 让实例可以访问构造函数原型(constructor.prototype)所在原型链上的属性
  3. 如果构造函数返回的结果不是引用数据类型
js
/*
  newFactory函数要接受不定量的参数,第一个参数是构造函数(也就是new操作符的目标函数),其余参数被构造函数使用。
  new Create() 是一种js语法糖。我们可以用函数调用的方式模拟实现
*/

function newFactory(ctor, ...args) {
  // 判断是不是函数
    if(typeof ctor !== 'function'){
      throw 'newOperator function the first param must be a function';
    }
  //1、创建一个空的对象
    let obj = new Object();
  //2、将空对象的原型prototype指向构造函数的原型
    obj.__proto__ = Object.create(ctor.prototype);
  //3、改变构造函数的上下文(this),并将剩余的参数传入
    let res = ctor.apply(obj, [...args]);
  //4、在构造函数有返回值的情况进行判断

    let isObject = typeof res === 'object' && typeof res !== null;
    let isFunction = typoof res === 'function';
    return isObect || isFunction ? res : obj;
};