详解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 相关文章推荐
javascript 选择文件夹对话框(web)
Jul 07 Javascript
判断一个变量是数组Array类型的方法
Sep 16 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 Javascript
javascript中的this详解
Dec 08 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
Dec 07 Javascript
基于JavaScript的操作系统你听说过吗?
Jan 28 Javascript
node.js使用redis储存session的方法
Sep 26 Javascript
layui实现给某一列加点击事件
Oct 26 Javascript
JavaScript判断浏览器版本的方法
Nov 03 Javascript
layui前端时间戳转化实例
Nov 15 Javascript
javascript操作向表格中动态加载数据
Aug 27 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
php 无限级 SelectTree 类
2009/05/19 PHP
php explode函数实例代码
2012/02/27 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
一段实用的php验证码函数
2016/05/19 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
JS的数组迭代方法
2015/02/05 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python使用selenium实现批量文件下载
2019/03/11 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
奥利奥广告词
2014/03/20 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
影视后期实训报告
2014/11/05 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python