Javascript中构造函数要注意的一些坑


Posted in Javascript onJanuary 23, 2017

前言

最近在家看书:《你不知道的Javascript》,看到构造函数调用时会绑定this,就顺便打开控制台输了一些代码,详细测试了一下。

构造函数简单的讲,即定义出来专供new 式调用的函数。

如:

function A(b) {
 this.b = b || 'bbb';
}

然后你就可以通过new ,来构建一个 A 的实例:

var a = new A('B')

但是,一个首要的坑是,构造函数与一个普通函数并无不同,如果你故意不使用new,或忘记用new,都会得到奇怪的错误:

var aa = A('adadada');

这样调用,并不会显式地报错,但实际上隐患深埋:

  1. aa并不是A的实例,而变成了 undefined
  2. 多了一个名为 b 的全局变量,值是 ‘adadada'

这就是无new 调用构造函数的坑。

下面说其他的:

构造函数自身有返回值

比如:

function A(b) {
 this.b = b || 'bbb';
 return {b: '0000'};
}

这个时候,无论是否使用new来调用A,得到的结果都会相同,即得到一个普通对象:{b:'0000′}

当然,此时是否带 new 调用,还是有一个不同点的,即:不带new时,依然会莫名声明一个 叫 b 的全局变量。

既然,构造函数有显式返回值时,会代替默认应该返回的this,成为返回值,那么,是不是所有返回值都能覆盖this呢?

测试显式返回值

众所周知,函数都是有返回值的,只是如果没有 return,则会返回undefined.

那么,我就在构造函数里显式返回一个undefined,会怎么样?

var a = function (){this.b = 'b'; return undefined};
new a(); // {b:'b'}

显式返回一个 undefined ,并不能阻止构造函数式调用的默认行为。

下图是更多测试:

Javascript中构造函数要注意的一些坑

简单的总结:

显式的返回以下值:undefined, null, boolean, number等基础类型,并不会代替 new 式调用的默认行为。

但显式返回以下值:{},[],RegExp, Date, Function,均会代替 new 调用的默认返回值 this.

大家都看到了,后者,全都是 对象,是复杂类型。

随手一记

前面说过,本该进行 new 式调用的构造函数,被当作普通函数调用,那么,如果函数体中,有 this.x = xxx 这样的赋值语句,则会被赋值给全局对象(即 windows),从而变成一个全局变量。

原因相信大家都知道,而本书中也专门讲过:函数调用时,默认的this就是绑定至全局对象。

而本书还提到:如果函数体是严格模式,则不会绑定 this 至全局对象,如:

var a = function (){'use strict';this.b = 'b'; return /111/g};
a(); // 直接报错

因为严格模式下,默认的 this 指向 undefined

所以说,有两点要提一下:

  1. 严格模式真不错
  2. 如果你想声明一个构造函数,那么严格模式是非常必要的

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript 事件对象的实现
Jul 13 Javascript
JavaScript 获取用户客户端操作系统版本
Aug 25 Javascript
javascript OFFICE控件测试代码
Dec 08 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
AngularJS通过$sce输出html的方法
Sep 22 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
JS数组去重常用方法实例小结【4种方法】
May 28 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
Sep 07 Javascript
Node.js 多线程完全指南总结
Mar 27 Javascript
Vue常用的全选/反选的示例代码
Feb 19 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
Jan 23 #Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
Jan 23 #Javascript
利用JS实现简单的日期选择插件
Jan 23 #Javascript
获取IE浏览器Cookie信息的方法
Jan 23 #Javascript
jQuery实现的简单悬浮层功能完整实例
Jan 23 #Javascript
原生和jQuery的ajax用法详解
Jan 23 #Javascript
基于MVC方式实现三级联动(JavaScript)
Jan 23 #Javascript
You might like
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
PHP中的替代语法介绍
2015/01/09 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
jquery 使用点滴函数代码
2011/05/20 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
web打印小结
2017/01/11 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
javascript实现计算器功能
2020/03/30 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python写的英文字符大小写转换代码示例
2015/03/06 Python
Python实现注册登录系统
2017/08/08 Python
python SocketServer源码深入解读
2019/09/17 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
物业招聘计划书
2014/01/10 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
小班幼儿评语大全
2014/04/30 职场文书
毕业生求职信范文
2014/06/29 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
公司员工体检通知
2015/04/21 职场文书
法院答辩状格式
2015/05/22 职场文书
五年级作文之学校的四季
2019/12/05 职场文书