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 跳转页面延迟2种方法
Mar 29 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
window.location不跳转的问题解决方法
Apr 17 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 Javascript
如何使用Bootstrap 按钮实例详解
Mar 29 Javascript
老生常谈ES6中的类
Jul 31 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
详解使用jQuery.i18n.properties实现js国际化
May 04 jQuery
vue中的适配px2rem示例代码
Nov 19 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 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格式化工具Beautify PHP小小BUG
2008/04/24 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
python提取字典key列表的方法
2015/07/11 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
运动会通讯稿300字
2014/02/02 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
条幅标语大全
2014/06/20 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
2014年部门工作总结
2014/11/12 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
七夕情人节问候语
2015/11/11 职场文书
党性修养心得体会2016
2016/01/21 职场文书
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏