原生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 this关键字的问题
Jan 09 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
May 13 Javascript
JS+CSS实现Li列表隔行换色效果的方法
Feb 16 Javascript
javascript实现当前页导航激活的方法
Feb 27 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 Javascript
Javascript数组循环遍历之forEach详解
Nov 07 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
May 21 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
Sep 11 Javascript
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
Apr 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
PHP6 mysql连接方式说明
2009/02/09 PHP
php开发环境配置记录
2011/01/14 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
python数据预处理方式 :数据降维
2020/02/24 Python
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
大学同学聚会邀请函
2014/01/29 职场文书
《白鹅》教学反思
2014/04/13 职场文书
公司管理制度范本
2015/08/03 职场文书
校运会班级霸气口号
2015/12/24 职场文书
Mysql事务索引知识汇总
2022/03/17 MySQL