原生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 相关文章推荐
js检测客户端不是firefox则提示下载
Apr 07 Javascript
JQuery打造PHP的AJAX表单提交实例
Nov 03 Javascript
js中关于String对象的replace使用详解
May 24 Javascript
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
Jul 26 Javascript
javascript删除数组元素并且数组长度减小的简单实例
Feb 14 Javascript
javascript实现全局匹配并替换的方法
Apr 27 Javascript
jQuery获取checkboxlist的value值的方法
Sep 27 Javascript
jQuery深拷贝Json对象简单示例
Jul 06 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 Javascript
2种简单的js倒计时方式
Oct 20 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
Nov 04 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
Dec 05 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
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
php提取微信账单的有效信息
2018/10/01 PHP
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
TensorFlow的权值更新方法
2018/06/14 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python文件及目录操作代码汇总
2020/07/08 Python
一文读懂Python 枚举
2020/08/25 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
试用期转正鉴定评语
2014/01/27 职场文书
农村婚礼主持词
2014/03/13 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
解除租房协议书
2014/12/03 职场文书
西双版纳导游词
2015/02/03 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
党员承诺书范文2015
2015/04/27 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL
Python pyecharts绘制条形图详解
2022/04/02 Python