详解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 相关文章推荐
详解JS 比较两个Json对象的值是否相等的实例
Nov 20 Javascript
关于javaScript注册click事件传递参数的不成功问题
Jul 18 Javascript
显示今天的日期js代码(阳历和农历)
Sep 30 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
分享一个精简的vue.js 图片lazyload插件实例
Mar 13 Javascript
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
解决vue 项目引入字体图标报错、不显示等问题
Sep 01 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 Javascript
小程序实现按下录音松开识别语音
Nov 22 Javascript
处理JavaScript值为undefined的7个小技巧
Jul 28 Javascript
JavaScript高级程序设计之基本引用类型
Nov 17 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同时支持GIF、png、JPEG
2006/10/09 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
php中switch语句用法详解
2015/08/17 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
xmlHTTP实例
2006/10/24 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
django自定义模板标签过程解析
2019/12/14 Python
python 下载文件的几种方法汇总
2021/01/06 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
五年级学生评语
2014/04/22 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
会议欢迎标语
2014/06/30 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
电工实训心得体会
2016/01/14 职场文书