写在前面
new 操作符具体做了什么,推荐看阮一峰的 实例对象与 new 命令,看完整个人神清气爽。
new 操作符是在 js 中一直就有的,是 js 面前对象开发的重要操作符。我们经常使用 new 创建一个对象实例,那么 new 操作符具体做了什么?
这里做简单介绍如下。
1. 创建了一个空对象,作为要返回的实例对象
首先,new 操作符肯定返回了一个对象,而且这个对象是按照其构造函数要求的样子进行构造的。
2. 将空对象的原型 _proto_ 指向构造函数的 prototype 属性
创建的空对象是 let obj = new Object()
或 let obj = {}
,该对象的原型 _proto_ 是 Object,但是我们使用自定义的构造函数创建对象实例时会多一层自定义的原型,就是构造函数中的 prototype 属性对应的用于存放公有属性的对象。因此 new 操作符就改变了新创建的对象的原型链。
3. 以指定构造函数的 this 为新创建的对象的方式调用构造函数
我们在使用 new 操作符进行创建对象实例后,会发现该对象已经带有了自己的某些属性,那么这些自己的属性是哪里来的呢?
答案是在构造函数构造出来的,构造函数内部有一个 this 对象,并且会发现在构造函数内有为 this 对象赋值的一个情况,如 this.age = 18
等等,我们知道,函数中 this 在没有进行指定的情况下会默认是调用该函数的对象。但是 this 是可以指定的,使用函数的 call 或 apply 方式进行函数的调用可以指定函数内的 this ,因此,new 操作符在调用构造函数的时候,将构造函数的 this 指定为新创建的对象,那么构造函数内带有 this 的语句就是在构造该对象的属性。因此 new 操作符肯定以指定 this 的方式调用了构造函数。
4. 判断构造函数返回值类型返回对象
构造函数也是函数,当然可以有返回值,但 new 操作符在调用构造函数时,规定如果构造函数没有指定返回值或者返回值为值类型,new 就会返回新创建的对象,new Fn() 拿到的就是新创建的对象实例,但如果构造函数返回的是一个对象,那 new 就会返回构造函数返回的对象,而不是对象实例了。