在加上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属性并将函数名作为赋值(仅函数对象)。

最新文章

  1. <实训|第六天>偷偷让新手的Linux无限重启附linux主机名称不是随便乱改的!
  2. JSP 基础语法
  3. unity 播放过场动画
  4. sql基本语句
  5. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
  6. mongodb.open失效导致访问地址404
  7. Error:/bin/bash: /bin/java: No such file or directory
  8. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第六篇(图片新闻的添加以及带分页的静态页的生成)
  9. css3 linear-gradient渐变效果及兼容性处理
  10. day_7
  11. Kafka 2.0 ConsumerGroupCommand新功能
  12. 如何写django中form的测试用例
  13. Fedora更改密码
  14. 安卓APP动态调试-IDA实用攻略
  15. DevExpress v17.2—WinForms篇(六)
  16. (译) 在AngularJS中使用的表单验证功能
  17. json字符串与java对象的相互转换(jackson)
  18. python 字典元素值的乘积
  19. Redux 源码解读 —— 从源码开始学 Redux
  20. 优化案例--改写IN条件为INNER JOIN

热门文章

  1. linux解压zip
  2. html超出不自动换行
  3. Android基础------通知栏
  4. AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.
  5. 关联容器 // append方法
  6. 2011 Multi-University Training Contest 8 - Host by HUST
  7. [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
  8. 【基础】ASP.net MVC 文件下载的几种方法(欢迎讨论)
  9. BZOJ1297:[SCOI2009]迷路——题解
  10. HDU5446:Unknown Treasure——题解