函数prototype
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 就会返回构造函数返回的对象,⽽不是对象实例了。