详解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 精粹读书笔记(1,2)
Feb 07 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
Sep 15 Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 Javascript
用JavaScript实现对话框的教程
Jun 04 Javascript
js 截取或者替换字符串中的数字实现方法
Jun 13 Javascript
微信小程序之页面拦截器的示例代码
Sep 07 Javascript
微信小程序实现点击按钮后修改颜色
Dec 05 Javascript
Vue循环中多个input绑定指定v-model实例
Aug 31 Javascript
vue3.0生命周期的示例代码
Sep 24 Javascript
微信小程序调用后台service教程详解
Nov 06 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
Nov 16 Javascript
jquery实现拖拽小方块效果
Dec 10 jQuery
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时的知识积累总结
2013/06/07 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
PHP云打印类完整示例
2016/10/15 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
Prototype Object对象 学习
2009/07/12 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
django使用JWT保存用户登录信息
2020/04/22 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
浅析NumPy 切片和索引
2020/09/02 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
大学同学聚会邀请函
2014/01/29 职场文书
党支部综合考察材料
2014/05/19 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
大连星海广场导游词
2015/02/10 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
居委会工作总结2015
2015/05/18 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
Redis可视化客户端小结
2021/06/10 Redis
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL