new 都用过,用来创建实例对象,可new 操作背后都做了些什么

new 背后的操作

根据mdn对new 运算符的解释
image.png

操作过程

  1. function Hexo (value) {
  2. this.name = value;
  3. }
  4. const hexo = new Hexo('张三');

第一步:
创建一个空对象那

  1. const obj = {};

第二步:
链接该对象到另一个对象(原型链)
将obj的隐士原型设置为Hexo的原型

  1. obj.__prop__ = Hexo.prototype;

第三步:
将步骤1新创建的对象作为 this 的上下文
将Hexo的this 修改为obj

  1. const ref = Hexo.apply(obj, arguments);

第四步:
如果该函数没有返回对象,则返回this

  1. return typeof ref === 'object' ? ref : obj;

代码:

  1. function myNew () {
  2. // 创建一个空的简单JavaScript对象(即{});
  3. const obj = {};
  4. // 取得该方法的第一个参数(并删除第一个参数),该参数是构造函数
  5. const Constructor = [].shift.apply(arguments);
  6. // 将新对象的内部属性__proto__指向构造函数的原型,这样新对象就可以访问原型中的属性和方法
  7. obj.__prop__ = Constructor.prototype;
  8. // 取得构造函数的返回值
  9. let ref = Constructor.apply(obj, arguments);
  10. // 如果返回值是一个对象就返回该对象,否则返回构造函数的一个实例对象
  11. return typeof ref === 'object' ? ref : obj;
  12. }

参考文章:

mdn: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new
w3c: https://262.ecma-international.org/#sec-new-operator
掘金:https://juejin.cn/post/6844904112857825293