js new 运算符到底做了什么?

5,404 阅读1分钟

MDN上是这么介绍new运算符的:new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一。

这里,我们探究的是new运算符实际上做了什么?

var a = new A();

当这段代码运行的时候,内部实际上执行的是:

// 1. 首先创建一个空对象
var o = new Object();
// 2. 将空对象的原型赋值为构造器函数的原型
o.__proto__ = A.prototype;
// 3. 更改构造器函数内部this,将其指向新创建的空对象
A.call(o);

最后当然是返回了。返回的时候会进行一个判断,如果构造器函数(这里即A)设置了返回值,并且返回值是一个Object类型的话,就直接返回该Object,否则返回新创建的空对象(这里即o);

function A(name){
  this.name = name;
  return {
    age: 12
  }
}
var a = new A('tom');
console.dir(a);
/*
Object
  age:12
  __proto__:Object
*/