详解Javascript中new()到底做了些什么?


Posted in Javascript onMarch 29, 2018

前言

和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象。 但在 javascript 中,万物皆对象,为什么还要通过 new 来产生对象? 本文将带你一起来探索 javascript 中 new 的奥秘...

要创建 Person 的新实例,必须使用 new 操作符。

以这种方式调用构造函数实际上会经历以下 4个步骤:

(1) 创建一个新对象;

(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;

(3) 执行构造函数中的代码(为这个新对象添加属性) ;

(4) 返回新对象。

 new 操作符

在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在JavaScript中,我们将这类方式成为Pseudoclassical。

基于上面的例子,我们执行如下代码

var obj = new Base();

这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是:

详解Javascript中new()到底做了些什么?

new操作符具体干了什么呢?其实很简单,就干了三件事情。

var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

第一行,我们创建了一个空对象obj

第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象

第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法。

如果我们给Base.prototype的对象添加一些函数会有什么效果呢?

例如代码如下:

Base.prototype.toString = function() {
 return this.id;
}

那么当我们使用new创建一个新对象的时候,根据__proto__的特性,toString这个方法也可以做新对象的方法被访问到。于是我们看到了:

构造子中,我们来设置‘类'的成员变量(例如:例子中的id),构造子对象prototype中我们来设置‘类'的公共方法。于是通过函数对象和Javascript特有的__proto__与prototype成员及new操作符,模拟出类和类实例化的效果。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery命令汇总,方便使用jquery的朋友
Jun 26 Javascript
struts2+jquery+json实现异步加载数据(自写)
Jun 24 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
Oct 08 Javascript
深入学习JavaScript对象
Oct 13 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
Vue.js 2.x之组件的定义和注册图文详解
Jun 19 Javascript
webpack4 升级迁移的实现
Sep 12 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
JS可断点续传文件上传实现代码解析
Jul 30 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 Javascript
Koa2 之文件上传下载的示例代码
Mar 29 #Javascript
AngularJS下$http服务Post方法传递json参数的实例
Mar 29 #Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 #Javascript
利用js实现前后台传送Json的示例代码
Mar 29 #Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
Mar 29 #Javascript
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 #Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 #Javascript
You might like
其他功能
2006/10/09 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
关于element的表单组件整理笔记
2021/02/05 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
python函数超时自动退出的实操方法
2020/12/28 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
岗位安全生产责任书
2014/07/28 职场文书
家长对孩子的寄语
2015/02/26 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
单位政审意见范文
2015/06/04 职场文书
电视新闻稿
2015/07/17 职场文书
Python中的pprint模块
2021/11/27 Python
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技