详解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 tab插件精简版分享
Sep 10 Javascript
ECMAScript 创建自己的js类库
Nov 22 Javascript
Javascript写入txt和读取txt文件示例
Feb 12 Javascript
javascipt:filter过滤介绍及使用
Sep 10 Javascript
对象题目的一个坑 理解Javascript对象
Dec 22 Javascript
js实现的在线调色板功能完整实例
Dec 21 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
Jun 22 Javascript
vue axios 二次封装的示例代码
Dec 08 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
vue使用自定义指令实现拖拽
Jan 29 Javascript
javascript中的with语句学习笔记及用法
Feb 17 Javascript
js中!和!!的区别与用法
May 09 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
php实现图片缩放功能类
2013/12/18 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
如何基于Python实现自动扫雷
2020/01/06 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
python 实现控制鼠标键盘
2020/11/27 Python
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
测量实习生自我鉴定
2013/09/19 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
渡河少年教学反思
2014/02/12 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
大一新生检讨书
2014/10/29 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年教师党员个人总结
2015/11/24 职场文书