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截取字符串的Slice、Substring、Substr函数详解和比较
Mar 20 Javascript
js delete 用法(删除对象属性及变量)
Aug 24 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
详解Angularjs filter过滤器
Feb 06 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
Apr 30 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
微信小程序 开发之快递查询功能的实现
Jan 09 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
微信小程序实现侧边栏分类
Oct 21 Javascript
jQuery实现简单飞机大战
Jul 05 jQuery
在 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实现HTML页面静态化的方法
2015/11/04 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python实现kmp算法的实例代码
2019/04/03 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
python实现贪吃蛇双人大战
2020/04/18 Python
浅析Python迭代器的高级用法
2020/07/16 Python
网上快餐厅创业计划书
2014/02/01 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
在python中读取和写入CSV文件详情
2022/06/28 Python