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 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
jQuery获取地址栏参数插件(模仿C#)
Oct 26 Javascript
使用 Node.js 做 Function Test实现方法
Oct 25 Javascript
jQuery获取对象简单实现方法小结
Oct 30 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
Apr 13 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
特殊日期提示功能的实现方法
Jun 16 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
Dec 08 Javascript
jQuery使用Layer弹出层插件闪退问题
Dec 22 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
Feb 10 Javascript
Vue中的基础过渡动画及实现原理解析
Dec 04 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 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 zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
简单实现python聊天程序
2018/04/01 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
django rest framework 自定义返回方式
2020/07/12 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
成龙洗发水广告词
2014/03/14 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
红旗渠导游词
2015/02/09 职场文书
初中军训感想
2015/08/07 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB