原生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删除提示框弹出是否删除对话框
Jan 07 Javascript
JavaScript中for-in遍历方式示例介绍
Feb 11 Javascript
2014 年最热门的21款JavaScript框架推荐
Dec 25 Javascript
jQuery实现点击小图显示大图代码分享
Aug 25 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
js的三种继承方式详解
Jan 21 Javascript
JS实现加载时锁定HTML页面元素的方法
Jun 24 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
Vue文件配置全局变量的实例
Sep 06 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
微信小程序新闻网站详情页实例代码
Jan 10 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
PHP 常见郁闷问题答解
2006/11/25 PHP
php实例化一个类的具体方法
2019/09/19 PHP
newxtree.js代码
2007/03/13 Javascript
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
如何利用Python 进行边缘检测
2020/10/14 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
《挑山工》的教学反思
2014/02/16 职场文书
教师对学生的寄语
2014/04/03 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
申请吧主发表的感言
2015/08/03 职场文书
mysql优化
2021/04/06 MySQL
使用Redis实现实时排行榜功能
2021/07/02 Redis