原生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动画之圆形运动,环绕鼠标运动作小球
Jul 20 Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 Javascript
jQuery实现移动 和 渐变特效的点击事件
Feb 26 Javascript
学习JavaScript设计模式之模板方法模式
Jan 20 Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 Javascript
jQuery插件实现图片轮播特效
Jun 16 Javascript
JavaScript页面实时显示当前时间实例代码
Oct 23 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
Dec 31 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
Apr 22 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
JavaScript实现求最大公共子串的方法
Feb 03 Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 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
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Django的分页器实例(paginator)
2017/12/01 Python
numpy中的高维数组转置实例
2018/04/17 Python
分析python请求数据
2018/08/19 Python
python自动识别文本编码格式代码
2019/12/26 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
机电专业求职信
2014/06/14 职场文书
化工专业自荐书
2014/06/16 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL