深入理解js中的new关键字
在js中我们经常会使用到new关键字,那我们在使用new关键字的时候,new到底做了什么呢?今天我们就来深入探究一下
1.初步使用
我们先来使用一下,这是一个正常操作
function Person() {this.name = "John";}let person = new Person();console.log(person.name); // John
new关键字主要做了这几件事情:
1.创建一个新对象
2.将构造函数的作用域赋值给新对象(this指向新对象)
3.执行构造函数中的代码
4.返回新对象
2.不使用new
那我们不使用new关键字,又会发生什么?
function Person1() {this.name = "John1";}let p1 = Person1();console.log(p1); //undefinedconsole.log(name); //name this指向window,所以输出John1
3.构造函数有return
function Person2() {this.name = "mike";return { age: 18 };}let p2 = new Person2();console.log(p2); //{age: 18}console.log(p2.name); //undefined
如果构造函数返回一个对象,new命令会直接返回这个return的对象
如果return的不是一个对象,那还是回按照new的实现步骤,返回实例对象
4.手动实现new关键字
function _new(fn, ...args) {if (typeof fn !== "function") {throw "fn must be a function";}// 创建一个对象,其对象的原型,指向构造函数的原型对象let obj = Object.create(fn.prototype);let res = fn.apply(obj, ...args);return res instanceof Object ? res : obj// 构造函数本身如果返回的是对象的话,则 返回的就是此对象// 如果返回值不是对象的话,则 返回对应的objreturn isObject || isFunction ? res : obj;}function Ele() {this.name = "Ele";}let e = _new(Ele)console.log(e.name); // Ele
如果你觉得本文对你有所帮助,欢迎评论,点赞与关注,一起卷~