2019独角兽企业重金招聘Python工程师标准>>>

0 一般函数调用

function personFn(name, age) {var personObj = {};personObj.name = name;personObj.age = age;return personObj;
}var alex = personFn('Alex', 30);
console.log(alex); // -> { name: 'Alex', age: 30 }

1 使用new 创建对象

function PersonConstructor(name, age) {this.name = name;this.age = age;
}var alex = new PersonConstructor('Alex', 30);
console.log(alex); // -> PersonConstructor { name: 'Alex', age: 30 }

使用new触发的函数一般称为“构造函数”,大写字母开头,生成的对象包含“构造函数”名+返回的对象

其实使用new触发函数,Javascript engine会特殊处理,下面注释的伪码可以看成Javscript engine加入的特殊处理

function PersonConstructor(name, age) {// this = {};// this.__proto__ = PersonConstructor.prototype;// Set up logic such that: if// there is a return statement// in the function body that// returns anything EXCEPT an// object, array, or function://     return 'this' (the newly//     constructed object)//     instead of that item at//     the return statement;this.name = name;this.age = age;// return this;
}

整段代码可以分解为下面几个部分:

1 创建一个空对象,将它绑定给this

2 将对象的_proto_属性设置为构造函数的原型prototype

3 返回逻辑:如果代码没有返回,或者返回的不是object, array, 或者 function中的一种,那么将返回this

4 在代码末尾添加return, 如果代码中没有return

例子

function Demo() {console.log(this);this.value = 5;return 10;
}/*1*/ var demo = new Demo(); // -> Demo {}
/*2*/ console.log(demo.__proto__ === Demo.prototype); // -> true
/*3*/ console.log(demo); // -> Demo { value: 5 }function SecondDemo() {this.val = '2nd demo';
}/*4*/ console.log(new SecondDemo()); // -> SecondDemo { val: '2nd demo' }

2 使用new 创建非构造函数

使用new 创建开头的普通函数,会发生什么?

function personFn(name, age) {var personObj = {};personObj.name = name;personObj.age = age;return personObj;
}var alex = new personFn('Alex', 30);
console.log(alex); // -> { name: 'Alex', age: 30 }

结果和普通函数调用是一样的,我们看看Javascript engine 加入代码后的样子

function personFn(name, age) {// this = {};// this.constructor = PersonConstructor;// this.__proto__ = PersonConstructor.prototype;// Set up logic such that: if// there is a return statement// in the function body that// returns anything EXCEPT an// object, array, or function://     return this (the newly//     constructed object)//     instead of that item at//     the return statement;var personObj = {};personObj.name = name;personObj.age = age;return personObj;// return this;
}

注释掉的代码主要做了下面四件事:

1 生成空对象,this绑定到这个空对象上

2 设置对象的构造函数和_proto_属性

3 设置返回逻辑

4 如果没有返回的话,添加return在代码的最后

其实这些操作并没有影响之前的代码,因为之前的代码并没有用到this, 而且也有返回对象

小结:使用new 对象时,构造函数里必须使用this才有价值

参考资料:

https://www.educative.io/collection/page/5679346740101120/5707702298738688/5750085036015616

转载于:https://my.oschina.net/u/2510955/blog/1581436

Javascript 面向对象编程中的‘new’相关推荐

  1. 在JavaScript面向对象编程中使用继承(5)

    明天就要回老家去过年了,关于这个"在JavaScript面向对象编程中使用继承"的话题居然还没有说完.如果不完成,留下来一拖就拖到明年去了.所以还是抽空把它写完,今年的事情今年做, ...

  2. 《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.1节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  3. 《JavaScript面向对象编程指南》——1.3 分析现状

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.3节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  4. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...

  5. JavaScript面向对象编程深入分析

    JavaScript面向对象编程深入分析 一. Javascript 面向对象编程:封装 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又 ...

  6. 《javascript面向对象编程指南》读书笔记

    <javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...

  7. (转)Javascript 面向对象编程(一):封装

    它们都是非常优秀的Javascript读物,推荐阅读. 笔记分成三部分.今天的第一部分是讨论"封装"(Encapsulation),后面的第二部分和第三部分讨论"继承&q ...

  8. 《JavaScript面向对象编程指南》——1.7 训练环境设置

    本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.7节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...

  9. 《JavaScript面向对象编程指南》—第128页错误指正

    最近在阅读<JavaScript面向对象编程指南第2版>,感觉很有帮助.今晚发现一个小错误,想指正一下. 如图,书中第128页: 书中的第三个例子代码如下: "potato&qu ...

最新文章

  1. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异
  2. git svn 疯子随想,续
  3. Ibatis.Net 各类的作用说明学习(三)
  4. 蓝桥杯2019年第十届C/C++省赛C组第一题-求和
  5. 【转】三层架构的业务逻辑层存在的意义
  6. 《JAVA程序设计基础(第3版)实验指导》pdf 附下载链接
  7. 计算机教学能力大赛实施报告模板,教学能力比赛教学实施报告现场汇报PPT模板-橙色主题.pptx...
  8. 细粒度粗粒度_粗粒度基准
  9. html5 LivePlayer 实时播放rtmp
  10. python语音识别 开源_DaCiDian是一个开源的中文普通话词汇,用于自动语音识别(ASR)...
  11. python键盘控制_python实现键盘控制鼠标移动
  12. Matlab调用动态链接库DLL文件
  13. NodeMCU-ESP8266烧录手把手教程
  14. ORACLE OCP 考试指南
  15. Springboot 项目中使用redis 的List结构来实现缓存分页分页
  16. 数据归一化(normalizing)的直观理解和通俗解释。
  17. 2010年06月《安全天下事之安全的证书与证书体系的安全》
  18. html 音乐 QQ播放器 外链 代码 播放器 外链 代码
  19. [游戏技术]L4D1支持L4D2官方地图运行方法
  20. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

热门文章

  1. Java对象排序、中文排序、SortedSet排序使用和源码讲解
  2. 压缩感知进阶——有关稀疏矩阵
  3. Stanford UFLDL教程 稀疏编码自编码表达
  4. 虚拟现实大会ChinaVR2015报告之-From Visual Content to Virtual Reality Data-driven Intelligence Production
  5. 2017.12.19 白盒测试作业第四次小组例会
  6. Tomcat在修改代码后不会自动reload解决办法
  7. Windows系统文件详解【大全】
  8. JSTL函数标签库 fn标签
  9. net-ldap for ruby openNebula ldap
  10. 淘宝API学习之道:淘宝API相关了解