详解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 模拟JQuery的Ready方法实现并出现的问题
Dec 06 Javascript
JavaScript每天必学之事件
Sep 18 Javascript
关于js原型的面试题讲解
Sep 25 Javascript
jquery css实现邮箱自动补全
Nov 14 Javascript
微信小程序实现简单评论功能
Nov 28 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
Apr 10 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
Apr 15 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
Nov 11 jQuery
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
react组件基本用法示例小结
Apr 27 Javascript
Javascript异步流程控制之串行执行详解
Sep 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
PDO防注入原理分析以及注意事项
2015/02/25 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
vue-loader教程介绍
2017/06/14 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
python实现发送邮件功能
2017/07/22 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
详解python里的命名规范
2018/07/16 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
python自动生成证件号的方法示例
2021/01/14 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
群众路线学习心得体会范文
2014/11/05 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python