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 相关文章推荐
[对联广告] JS脚本类
Aug 27 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
May 13 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
jQuery构造函数init参数分析续
May 13 Javascript
举例讲解Node.js中的Writable对象
Jul 29 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
Aug 19 Javascript
实例详解angularjs和ajax的结合使用
Oct 22 Javascript
JS判断浏览器是否安装flash插件的简单方法
Sep 13 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 Javascript
使用Node.js实现RESTful API的示例
Aug 01 Javascript
bootstrap Table服务端处理分页(后台是.net)
Oct 19 Javascript
vue使用video.js进行视频播放功能
Jul 18 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
图形数字验证代码
2006/10/09 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
js打开windows上的可执行文件示例
2014/05/27 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python实现的桶排序算法示例
2017/11/29 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
python顺序执行多个py文件的方法
2019/06/29 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
苹果台湾官网:Apple台湾
2019/01/05 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
2015年党建工作总结
2015/03/30 职场文书
教师思想工作总结2015
2015/05/13 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js