原生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 控制 html元素 显示/隐藏实现代码
Sep 01 Javascript
JS动态显示表格上下frame的方法
Mar 31 Javascript
原生javascript实现自动更新的时间日期
Feb 12 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
JS常用算法实现代码
Nov 14 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
Apr 23 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
Javascript刷新页面的实例
Sep 23 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 Javascript
JS原型对象操作实例分析
Jun 06 Javascript
javascript利用canvas实现鼠标拖拽功能
Jul 23 Javascript
微信小程序实现多张图片上传功能
Nov 18 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
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
2013/06/24 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
拖拉表格的JS函数
2008/11/20 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
python实现在windows下操作word的方法
2015/04/28 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
一些网络技术方面的面试题
2014/05/01 面试题
自荐书4要点
2014/01/25 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
《搭石》教学反思
2016/02/18 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书