Javascript中构造函数要注意的一些坑
发布时间 - 2026-01-10 22:44:46 点击率:次前言

最近在家看书:《你不知道的Javascript》,看到构造函数调用时会绑定this,就顺便打开控制台输了一些代码,详细测试了一下。
构造函数简单的讲,即定义出来专供new 式调用的函数。
如:
function A(b) {
this.b = b || 'bbb';
}
然后你就可以通过new ,来构建一个 A 的实例:
var a = new A('B')
但是,一个首要的坑是,构造函数与一个普通函数并无不同,如果你故意不使用new,或忘记用new,都会得到奇怪的错误:
var aa = A('adadada');
这样调用,并不会显式地报错,但实际上隐患深埋:
- aa并不是A的实例,而变成了 undefined
- 多了一个名为 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
所以说,有两点要提一下:
- 严格模式真不错
- 如果你想声明一个构造函数,那么严格模式是非常必要的
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# javascript
# 构造函数
# javascript的构造函数
# javascript中构造函数
# JavaScript字符串转数字的5种方法及遇到的坑
# 使用PHP json_decode可能遇到的坑与解决方法
# 基于js粘贴事件paste简单解析以及遇到的坑
# JavaScript代码编写中各种各样的坑和填坑方法
# JavaScript中使用typeof运算符需要注意的几个坑
# JS大坑之19位数的Number型精度丢失问题详解
# JS面试题大坑之隐式类型转换实例代码
# 对象题目的一个坑 理解Javascript对象
# 弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
# 返回值
# 绑定
# 本书
# 大家都
# 全局变量
# 报错
# 则会
# 一个普通
# 都是
# 如果你
# 就在
# 是有
# 你就
# 这就是
# 都能
# 其他的
# 说过
# 你想
# 可以通过
# 如果没有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高端企业智能建站程序:SEO优化与响应式模板定制开发
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
如何正确下载安装西数主机建站助手?
JavaScript常见的五种数组去重的方式
如何用腾讯建站主机快速创建免费网站?
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Android使用GridView实现日历的简单功能
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
教你用AI将一段旋律扩展成一首完整的曲子
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何用西部建站助手快速创建专业网站?
如何在阿里云完成域名注册与建站?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何选择可靠的免备案建站服务器?
如何解决hover在ie6中的兼容性问题
利用python获取某年中每个月的第一天和最后一天
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
利用JavaScript实现拖拽改变元素大小
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Laravel API资源类怎么用_Laravel API Resource数据转换
Mybatis 中的insertOrUpdate操作
jQuery 常见小例汇总
JavaScript如何实现类型判断_typeof和instanceof有什么区别
如何用IIS7快速搭建并优化网站站点?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
如何快速上传建站程序避免常见错误?
JS经典正则表达式笔试题汇总
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
js实现获取鼠标当前的位置
七夕网站制作视频,七夕大促活动怎么报名?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
高性价比服务器租赁——企业级配置与24小时运维服务
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何快速配置高效服务器建站软件?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Linux系统命令中tree命令详解
BootStrap整体框架之基础布局组件
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】

