new操作符的内部运行解析
在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassical。
基于上面的例子,我们执行如下代码
var obj = new Base(); |
这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是:
new操作符具体干了什么呢?其实很简单,就干了三件事情。
|
var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj); |
第一行,我们创建了一个空对象obj
第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象
第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法,请参看陈皓《Javascript 面向对象编程》文章
var cat = new Animal("cat");
JS引擎执行这句代码时,在内部做了很多工作,用伪代码模拟其工作流程如下:
new Animal("cat") = { var obj = {}; obj.__proto__ = Animal.prototype; var result = Animal.call(obj,"cat"); return typeof result === 'object'? result : obj;
}
(1)创建一个空对象obj;
(2)把obj的__proto__ 指向Animal的原型对象prototype,此时便建立了obj对象的原型链:obj->Animal.prototype->Object.prototype->null
【如果你不了解JS原型链,请先阅读:JS原型和原型链】
(3)在obj对象的执行环境调用Animal函数并传递参数“cat”。 相当于var result = obj.Animal("cat")。
当这句执行完之后,obj便产生了属性name并赋值为"cat"。【关于JS中call的用法请阅读:JS的call和apply】
(4)考察第3步返回的返回值,如果无返回值或者返回一个非对象值,则将obj返回作为新对象;否则会将返回值作为新对象返回。
一般情况下,函数对象在产生时会内置name属性并将函数名作为赋值(仅函数对象)。
最新文章
- <;实训|第六天>;偷偷让新手的Linux无限重启附linux主机名称不是随便乱改的!
- JSP 基础语法
- unity 播放过场动画
- sql基本语句
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
- mongodb.open失效导致访问地址404
- Error:/bin/bash: /bin/java: No such file or directory
- “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第六篇(图片新闻的添加以及带分页的静态页的生成)
- css3 linear-gradient渐变效果及兼容性处理
- day_7
- Kafka 2.0 ConsumerGroupCommand新功能
- 如何写django中form的测试用例
- Fedora更改密码
- 安卓APP动态调试-IDA实用攻略
- DevExpress v17.2—WinForms篇(六)
- (译) 在AngularJS中使用的表单验证功能
- json字符串与java对象的相互转换(jackson)
- python 字典元素值的乘积
- Redux 源码解读 —— 从源码开始学 Redux
- 优化案例--改写IN条件为INNER JOIN
热门文章
- linux解压zip
- html超出不自动换行
- Android基础------通知栏
- AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.
- 关联容器 // append方法
- 2011 Multi-University Training Contest 8 - Host by HUST
- [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
- 【基础】ASP.net MVC 文件下载的几种方法(欢迎讨论)
- BZOJ1297:[SCOI2009]迷路——题解
- HDU5446:Unknown Treasure——题解