详解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 相关文章推荐
Prototype使用指南之base.js
Jan 10 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
Jul 25 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
第一次接触JS require.js模块化工具
Apr 17 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
Vue2单一事件管理组件通信
May 09 Javascript
详解axios在vue中的简单配置与使用
May 10 Javascript
微信小程序倒计时功能实现代码
Nov 09 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
ES5新增数组的实现方法
May 12 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Django 外键的使用方法详解
2019/07/19 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
社会实践心得体会
2014/01/03 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
项目建议书格式
2014/03/12 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
2014年安全生产责任书
2014/07/22 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
活动新闻稿范文
2015/07/17 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
创业计划书之家教托管
2019/09/25 职场文书
MySQL之DML语言
2021/04/05 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL