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 相关文章推荐
ext 列表页面关于多行查询的办法
Mar 25 Javascript
Web开发者必备的12款超赞jQuery插件
Dec 03 Javascript
一次失败的jQuery优化尝试小结
Feb 06 Javascript
jQuery 中国省市两级联动选择附图
May 14 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
JavaScript中数组的22种方法必学(推荐)
Jul 20 Javascript
详解基于vue-cli配置移动端自适应
Jan 13 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
Nov 22 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
javascript 代码是如何被压缩的示例代码
May 06 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
May 13 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
在 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 存取 MySQL 数据库的一个例子
2006/10/09 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
python抓取文件夹的所有文件
2018/02/27 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Python 复平面绘图实例
2019/11/21 Python
Python实现图像的垂直投影示例
2020/01/17 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
时尚圣经:The Fashion Bible
2019/03/03 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
初任培训自我鉴定
2013/10/07 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
补充协议书
2015/01/28 职场文书
于丹论语心得观后感
2015/06/15 职场文书
小学教育见习总结
2015/06/23 职场文书
竞选稿之小学班干部
2019/10/31 职场文书