原生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 相关文章推荐
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
Node.js安装教程和NPM包管理器使用详解
Aug 16 Javascript
javascript实时显示北京时间的方法
Mar 12 Javascript
深入理解js中this的用法
May 28 Javascript
Node.js下自定义错误类型详解
Oct 17 Javascript
bootstrap Table插件使用demo
Aug 07 Javascript
vuex进阶知识点巩固
May 20 Javascript
学习React中ref的两个demo示例
Aug 14 Javascript
angular异步验证防抖踩坑实录
Dec 01 Javascript
vue-resourc发起异步请求的方法
Feb 11 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 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
Mysql的常用命令
2006/10/09 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
Node.js编码规范
2014/07/14 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
Node.js使用Angular简单示例
2018/05/11 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
Python3匿名函数用法示例
2018/07/25 Python
python实现PID算法及测试的例子
2019/08/08 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
详解Python高阶函数
2020/08/15 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
委托协议书范本
2014/04/22 职场文书
增员口号大全
2014/06/18 职场文书
英语教研活动总结
2014/07/02 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
2016大学生党校学习心得体会
2016/01/06 职场文书
初二英语教学反思
2016/02/15 职场文书