详解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使用指南之enumerable.js
Jan 10 Javascript
JS下载文件|无刷新下载文件示例代码
Apr 17 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
JavaScript构造函数详解
Dec 27 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
vue语法之拼接字符串的示例代码
Oct 25 Javascript
JS基于封装函数实现的表格分页完整示例
Jun 26 Javascript
layui自定义ajax左侧三级菜单
Jul 26 Javascript
vue-cli3跨域配置的简单方法
Sep 06 Javascript
javascript实现移动端红包雨页面
Jun 23 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
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
使用JavaScript switch case 另类写法
2010/03/14 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
Python列表list数组array用法实例解析
2014/10/28 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
Django 路由控制的实现代码
2018/11/08 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
python解包概念及实例
2021/02/17 Python
DataList 能否分页,请问如何实现?
2015/05/03 面试题
应聘教师自荐信
2013/10/12 职场文书
网吧最新创业计划书范文
2014/03/27 职场文书
个人催款函范文
2015/06/23 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
毕业生入职感言
2015/07/31 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
SQL 聚合、分组和排序
2021/11/11 MySQL