详解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实现的完美渐变弹出层效果代码
Apr 02 Javascript
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
CSS图片响应式 垂直水平居中
Aug 14 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
Nov 24 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
Nov 25 Javascript
基于JS模仿windows文件按名称排序效果
Jun 29 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 Javascript
JavaScript实现简单的四则运算计算器完整实例
Apr 28 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
javascript+html5+css3自定义弹出窗口效果
Oct 26 Javascript
从零开始搭建vue移动端项目到上线的步骤
Oct 15 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
php购物车实现代码
2011/10/10 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
python在linux中输出带颜色的文字的方法
2014/06/19 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
Python列表切片常用操作实例解析
2019/12/16 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
毕业自我鉴定怎么写
2014/03/25 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
行风评议整改报告
2014/11/06 职场文书
信用卡催款律师函
2015/05/27 职场文书
超市店长竞聘书
2015/09/15 职场文书
Python进度条的使用
2021/05/17 Python