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 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
jQuery图片预加载 等比缩放实现代码
Oct 04 Javascript
简述JavaScript的正则表达式中test()方法的使用
Jun 16 Javascript
javascript实现瀑布流加载图片原理
Feb 02 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
May 16 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
jquery实现自适应banner焦点图
Feb 16 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
vue做移动端适配最佳解决方案(亲测有效)
Sep 04 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
关于layui表单中按钮自动提交的解决方法
Sep 09 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
PHP 转义使用详解
2013/07/15 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
很酷的javascript loading效果代码
2008/06/18 Javascript
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
js表头排序实现方法
2015/01/16 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
python的正则表达式re模块的常用方法
2013/03/09 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python类中self参数用法详解
2020/02/13 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
先进事迹报告会感言
2014/01/24 职场文书
硕士学位申请报告
2015/05/15 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
2022微信温控新功能上线
2022/05/09 数码科技