详解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去除空格的三种方法(正则/传参函数/trim)
Feb 06 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
js实现简单的选项卡效果
Feb 23 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
AngularJS中的作用域实例分析
May 16 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
javascript中的event loop事件循环详解
Dec 14 Javascript
vue 解决异步数据更新问题
Oct 29 Javascript
使用Promise封装小程序wx.request的实现方法
Nov 13 Javascript
JS前端广告拦截实现原理解析
Feb 17 Javascript
小程序分享链接onShareAppMessage的具体用法
May 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
推荐文章系统(一)
2006/10/09 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
表格 隔行换色升级版
2009/11/07 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
调解协议书
2014/04/16 职场文书
师德师风演讲稿
2014/05/05 职场文书
比赛口号大全
2014/06/10 职场文书
借条格式范本
2015/05/25 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android