详解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权威指南 学习笔记之null和undefined
Sep 25 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
javascript实现根据3原色制作颜色选择器的方法
Jul 17 Javascript
jQuery实现底部浮动窗口效果
Sep 07 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
Mar 24 Javascript
JQuery元素快速查找与操作
Apr 22 jQuery
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 Javascript
Node.js中package.json中库的版本号(~和^)
Apr 02 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
Apr 16 Javascript
vue 中url 链接左边的小图标更改问题
Dec 30 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
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
JS中递归函数
2016/06/17 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
Python常见异常分类与处理方法
2017/06/04 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python绘制雪景图
2019/12/16 Python
Python 实现数组相减示例
2019/12/27 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
C语言开发工程师测试题
2016/12/20 面试题
opencv实现图像平移效果
2021/03/24 Python
2015年三年级班主任工作总结
2015/05/21 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
mysql 获取相邻数据项
2022/05/11 MySQL