原生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 left,right,mid函数
Jun 10 Javascript
浏览器常用高宽的jquery插件
Feb 24 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
Javascript获取当前日期的农历日期代码
Oct 08 Javascript
jquery自定义表格样式
Nov 23 Javascript
jQuery隐藏和显示效果实现
Apr 06 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
浅谈JS的基础类型与引用类型
Sep 13 Javascript
jQuery实现的简单在线计算器功能
May 11 jQuery
微信小程序 自定义消息提示框
Aug 06 Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 Javascript
Vue组件间的通信pubsub-js实现步骤解析
Mar 11 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
客服工作职责
2013/12/11 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
经济管理专业求职信
2014/06/09 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
银行贷款委托书范本
2014/10/11 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
简历自我评价优缺点
2015/03/11 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js