一.前言app
众所周知:没有对象怎么办?那就new一个!函数
那么在JS中,当咱们new一个对象的时候,这个new关键字内部都干了什么呢?测试
如今咱们就来剖析一下原生JS中new关键字内部的工做原理。this
二.原始的newprototype
首先,咱们先new一个对象看看:code
//建立Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } //实例化对象小明 xm = new Person('xiaoming',18); //打印实例化出来的对象小明 console.log(xm);
打印结果:对象
从打印结果中能够看到:继承
用new关键字实例化对象时,首先建立了一个空对象xm,而且这个空对象包含两个属性name和age,分别对应构造函数中的两个属性,其次咱们也能够知道实例化出来的这个对象xm是继承自Person.prototype,那么如今咱们就能够总结出new关键字在实例化对象时内部都干了什么,其实,new关键字内部干了以下三件事(已知构造函数为Func):io
1.建立一个空对象,并使该空对象继承Func.prototype;console
2.执行构造函数,并将this指向刚刚建立的新对象;
3.返回新对象;
三.封装_new函数
当咱们知道new关键字的内部原理后,咱们就能够封装一个_new函数,使其用于与new关键字一样的功能。
_new函数须要传入如下几个参数:
第一个参数:构造函数名Func;
第二个参数及后面的参数:构造函数的参数
function _new(){ //1.拿到传入的参数中的第一个参数,即构造函数名Func var Func = [].shift.call(arguments); //2.建立一个空对象obj,并让其继承Func.prototype var obj = Object.create(Func.prototype); //3.执行构造函数,并将this指向建立的空对象obj Func.apply(obj,arguments) //4.返回建立的对象obj return obj }
四.测试_new函数
封装好后,咱们来测试一下封装的_new函数,看看它是否实现了和原生new关键字一样的功能。
//建立Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } function _new(){ //1.拿到传入的参数中的第一个参数,即构造函数名Func var Func = [].shift.call(arguments); //2.建立一个空对象obj,并让其继承Func.prototype var obj = Object.create(Func.prototype); //3.执行构造函数,并将this指向建立的空对象obj Func.apply(obj,arguments) //4.返回建立的对象obj return obj } xm = _new(Person,'xiaoming',18); console.log(xm);
测试结果:
从测试结果看到,_new函数的功能与new关键字彻底一致。
总结
以上所述是小编给你们介绍的原生JS封装_new函数实现new关键字的功能,但愿对你们有所帮助,若是你们有任何疑问欢迎给我留言,小编会及时回复你们的!