原生JS封装_new函数实现new关键字的功能


Posted in Javascript onAugust 12, 2018

一.前言

众所周知:没有对象怎么办?那就new一个!

那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢?
现在我们就来剖析一下原生JS中new关键字内部的工作原理。

二.原始的new

首先,我们先new一个对象看看:

//创建Person构造函数,参数为name,age
 function Person(name,age){
 this.name = name;
 
this.age = age;
  }
 //实例化对象小明
 xm = new Person('xiaoming',18);
 //打印实例化出来的对象小明
 console.log(xm);

打印结果:

原生JS封装_new函数实现new关键字的功能

原生JS封装_new函数实现new关键字的功能

从打印结果中可以看到:

用new关键字实例化对象时,首先创建了一个空对象xm,并且这个空对象包含两个属性name和age,分别对应构造函数中的两个属性,其次我们也可以知道实例化出来的这个对象xm是继承自Person.prototype,那么现在我们就可以总结出new关键字在实例化对象时内部都干了什么,其实,new关键字内部干了如下三件事(已知构造函数为Func):

1.创建一个空对象,并使该空对象继承Func.prototype;

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);

测试结果:

原生JS封装_new函数实现new关键字的功能

原生JS封装_new函数实现new关键字的功能

从测试结果看到,_new函数的功能与new关键字完全一致。

总结

以上所述是小编给大家介绍的原生JS封装_new函数实现new关键字的功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
简洁短小的 JavaScript IE 浏览器判定代码
Mar 21 Javascript
php上传图片并给图片打上透明水印的代码
Jun 07 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
Dec 10 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 Javascript
jQuery淡入淡出元素让其效果更为生动
Sep 01 Javascript
JavaScript获取图片真实大小代码实例
Sep 24 Javascript
jQuery中hide()方法用法实例
Dec 24 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
深入浅析var,let,const的异同点
Aug 07 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
vue 虚拟DOM的原理
Oct 03 Javascript
axios向后台传递数组作为参数的方法
Aug 11 #Javascript
让axios发送表单请求形式的键值对post数据的实例
Aug 11 #Javascript
axios的拦截请求与响应方法
Aug 11 #Javascript
解决axios发送post请求返回400状态码的问题
Aug 11 #Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 #Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 #Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 #Javascript
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
微信小程序实现日历功能
2018/11/27 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
js实现多图和单图上传显示
2019/12/18 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
浅析Python中的序列化存储的方法
2015/04/28 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
python框架django项目部署相关知识详解
2019/11/04 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
安全技术说明书
2014/05/09 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
2015年小学开学寄语
2015/02/27 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js