Javascript 面向对象编程中的‘new’
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’相关推荐
- 在JavaScript面向对象编程中使用继承(5)
明天就要回老家去过年了,关于这个"在JavaScript面向对象编程中使用继承"的话题居然还没有说完.如果不完成,留下来一拖就拖到明年去了.所以还是抽空把它写完,今年的事情今年做, ...
- 《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史
本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.1节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...
- 《JavaScript面向对象编程指南》——1.3 分析现状
本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.3节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...
- JavaScript面向对象编程深入分析
JavaScript面向对象编程深入分析 一. Javascript 面向对象编程:封装 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又 ...
- 《javascript面向对象编程指南》读书笔记
<javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...
- (转)Javascript 面向对象编程(一):封装
它们都是非常优秀的Javascript读物,推荐阅读. 笔记分成三部分.今天的第一部分是讨论"封装"(Encapsulation),后面的第二部分和第三部分讨论"继承&q ...
- 《JavaScript面向对象编程指南》——1.7 训练环境设置
本节书摘来自异步社区<JavaScript面向对象编程指南>一书中的第1章,第1.7节,作者: [加]Stoyan Stefanov 译者: 凌杰 更多章节内容可以访问云栖社区" ...
- 《JavaScript面向对象编程指南》—第128页错误指正
最近在阅读<JavaScript面向对象编程指南第2版>,感觉很有帮助.今晚发现一个小错误,想指正一下. 如图,书中第128页: 书中的第三个例子代码如下: "potato&qu ...
最新文章
- python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异
- git svn 疯子随想,续
- Ibatis.Net 各类的作用说明学习(三)
- 蓝桥杯2019年第十届C/C++省赛C组第一题-求和
- 【转】三层架构的业务逻辑层存在的意义
- 《JAVA程序设计基础(第3版)实验指导》pdf 附下载链接
- 计算机教学能力大赛实施报告模板,教学能力比赛教学实施报告现场汇报PPT模板-橙色主题.pptx...
- 细粒度粗粒度_粗粒度基准
- html5 LivePlayer 实时播放rtmp
- python语音识别 开源_DaCiDian是一个开源的中文普通话词汇,用于自动语音识别(ASR)...
- python键盘控制_python实现键盘控制鼠标移动
- Matlab调用动态链接库DLL文件
- NodeMCU-ESP8266烧录手把手教程
- ORACLE OCP 考试指南
- Springboot 项目中使用redis 的List结构来实现缓存分页分页
- 数据归一化(normalizing)的直观理解和通俗解释。
- 2010年06月《安全天下事之安全的证书与证书体系的安全》
- html 音乐 QQ播放器 外链 代码 播放器 外链 代码
- [游戏技术]L4D1支持L4D2官方地图运行方法
- C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策
热门文章
- Java对象排序、中文排序、SortedSet排序使用和源码讲解
- 压缩感知进阶——有关稀疏矩阵
- Stanford UFLDL教程 稀疏编码自编码表达
- 虚拟现实大会ChinaVR2015报告之-From Visual Content to Virtual Reality Data-driven Intelligence Production
- 2017.12.19 白盒测试作业第四次小组例会
- Tomcat在修改代码后不会自动reload解决办法
- Windows系统文件详解【大全】
- JSTL函数标签库 fn标签
- net-ldap for ruby openNebula ldap
- 淘宝API学习之道:淘宝API相关了解