原生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 相关文章推荐
网站页面自动跳转实现方法PHP、JSP(下)
Aug 01 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
Apr 05 Javascript
jquery 实现两Select 标签项互调示例代码
Sep 25 Javascript
jQuery中animate用法实例分析
Mar 09 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
Jun 16 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
Jan 26 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
Nov 20 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
Apr 12 jQuery
js自定义input文件上传样式
Oct 26 Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 Javascript
Vue 开发必须知道的36个技巧(小结)
Oct 09 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
中东人咖啡哲学
2021/03/03 咖啡文化
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
Three.js基础学习教程
2017/11/16 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
Python3 合并二叉树的实现
2019/09/30 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
食品安全责任书
2014/04/15 职场文书
公司委托书格式范本
2014/09/16 职场文书
求职自我评价范文100字
2014/09/23 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
八月一日观后感
2015/06/10 职场文书
文明礼仪主题班会
2015/08/13 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
python如何为list实现find方法
2022/05/30 Python
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技