详解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的Cookies
Jan 16 Javascript
一段利用WSH修改和查看IP配置的代码
May 11 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
Jan 12 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
Jun 04 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
BootStrap中
Dec 10 Javascript
vue中各组件之间传递数据的方法示例
Jul 27 Javascript
详解webpack提取第三方库的正确姿势
Dec 22 Javascript
在vue中使用vue-echarts-v3的实例代码
Sep 13 Javascript
微信小程序城市选择及搜索功能的方法
Mar 22 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中header和session_start前不能有输出原因分析
2013/01/11 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
python使用psutil模块获取系统状态
2016/08/27 Python
python去掉行尾的换行符方法
2017/01/04 Python
python+django加载静态网页模板解析
2017/12/12 Python
Python中collections模块的基本使用教程
2018/12/07 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
详解KMP算法以及python如何实现
2020/09/18 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
会计应届生的自荐信
2013/12/13 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
仲裁协议书
2014/09/26 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS
JavaScript实现两个数组的交集
2022/03/25 Javascript