重学JS系列 —— new操作符

new操作符的作用

  • new操作符会返回一个对象,所以我们需要在内部创建一个对象。
  • 这个对象,也就是构造函数中的this,可以访问挂载到this上的任意属性。
  • 这个对象可以访问构造函数原型上的属性,所以需要将对象与构造函数联系起来。
  • 返回原始值需要忽略,返回对象需要正常处理。

手动实现new操作符

1
2
3
4
5
6
function create(Con, ...args) {
let obj = {};
Object.setPrototypeOf(obj, Con.prototype);
let result = Con.apply(obj, args);
return result instanceOf Object ? result : obj;
}

实现过程解析

  • 函数接收不定量参数,第一个参数为构造函数,接下来的参数被构造函数使用。
  • 内部创建一个空对象obj。
  • 通过setPrototypeOf使对象obj访问到构造函数原型链上的属性,等同于 obj.__proto__ = Con.prototype
  • 将obj绑定到构造函数上,并传入剩余参数。
  • 判断构造函数返回值是否为对象,如果为对象就使用构造函数返回的值,否则使用obj,这样就实现了忽略构造函数返回的原始值。
0%