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 21 Javascript
javascript与CSS复习(三)
Jun 29 Javascript
jQuery中需要注意的细节问题小结
Dec 06 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
Jquery实现控件的隐藏和显示实例
Feb 08 Javascript
js实现通用的微信分享组件示例
Mar 10 Javascript
jQuery实现的简洁下拉菜单导航效果代码
Aug 26 Javascript
遍历json 对象的属性并且动态添加属性的实现
Dec 02 Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 Javascript
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
微信小程序HTTP请求从0到1封装
Sep 09 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 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+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
php截取字符串函数分享
2015/02/02 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
javascript 数组精简技巧小结
2020/02/26 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
详解python中字典的循环遍历的两种方式
2017/02/07 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
详解如何设置Python环境变量?
2019/05/13 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
《珍珠泉》教学反思
2014/02/20 职场文书
给全校老师的建议书
2014/03/13 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
2014年电教工作总结
2014/12/19 职场文书
股份转让协议书范本
2015/01/27 职场文书
应聘教师自荐信
2015/03/26 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书