全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Javascript中构造函数要注意的一些坑

前言

最近在家看书:《你不知道的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 ,并不能阻止构造函数式调用的默认行为。

下图是更多测试:

简单的总结:

显式的返回以下值: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的构造函数  # javascript中构造函数  # JavaScript字符串转数字的5种方法及遇到的坑  # 使用PHP json_decode可能遇到的坑与解决方法  # 基于js粘贴事件paste简单解析以及遇到的坑  # JavaScript代码编写中各种各样的坑和填坑方法  # JavaScript中使用typeof运算符需要注意的几个坑  # JS大坑之19位数的Number型精度丢失问题详解  # JS面试题大坑之隐式类型转换实例代码  # 对象题目的一个坑 理解Javascript对象  # 弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】  # 返回值  # 绑定  # 本书  # 大家都  # 全局变量  # 报错  # 则会  # 一个普通  # 都是  # 如果你  # 就在  # 是有  # 你就  # 这就是  # 都能  # 其他的  # 说过  # 你想  # 可以通过  # 如果没有 


相关文章: 定制建站哪家更专业可靠?推荐榜单揭晓  Android自定义listview布局实现上拉加载下拉刷新功能  山东网站制作公司有哪些,山东大源集团官网?  建站之星官网登录失败?如何快速解决?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  表情包在线制作网站免费,表情包怎么弄?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  微信小程序 五星评分(包括半颗星评分)实例代码  盐城做公司网站,江苏电子版退休证办理流程?  如何在宝塔面板创建新站点?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  建站ABC备案流程中有哪些关键注意事项?  如何高效配置IIS服务器搭建网站?  家具网站制作软件,家具厂怎么跑业务?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  如何快速搭建响应式可视化网站?  网站网页制作专业公司,怎样制作自己的网页?  常州企业建站如何选择最佳模板?  C++如何编写函数模板?(泛型编程入门)  专业公司网站制作公司,用什么语言做企业网站比较好?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  宿州网站制作公司兴策,安徽省低保查询网站?  建站主机如何选?性能与价格怎样平衡?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何通过VPS建站无需域名直接访问?  如何规划企业建站流程的关键步骤?  如何做网站制作流程,*游戏网站怎么搭建?  网站制作网站,深圳做网站哪家比较好?  制作宣传网站的软件,小红书可以宣传网站吗?  如何通过虚拟主机快速完成网站搭建?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  已有域名和空间如何快速搭建网站?  如何在万网ECS上快速搭建专属网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何在阿里云完成域名注册与建站?  建站上市公司网站建设方案与SEO优化服务定制指南  家庭建站与云服务器建站,如何选择更优?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  北京建设网站制作公司,北京古代建筑博物馆预约官网?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  宝塔新建站点报错如何解决?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  网站制作新手教程,新手建设一个网站需要注意些什么?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站org新手必看:2024最新搭建流程与模板选择技巧 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。