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');

这样调用,并不会显式地报错,但实际上隐患深埋:

  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开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】  # 返回值  # 绑定  # 本书  # 大家都  # 全局变量  # 报错  # 则会  # 一个普通  # 都是  # 如果你  # 就在  # 是有  # 你就  # 这就是  # 都能  # 其他的  # 说过  # 你想  # 可以通过  # 如果没有 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 黑客入侵网站服务器的常见手法有哪些?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  如何在Windows环境下新建FTP站点并设置权限?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何在IIS服务器上快速部署高效网站?  如何实现javascript表单验证_正则表达式有哪些实用技巧  JS中对数组元素进行增删改移的方法总结  海南网站制作公司有哪些,海口网是哪家的?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Linux系统命令中tree命令详解  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  WEB开发之注册页面验证码倒计时代码的实现  Python图片处理进阶教程_Pillow滤镜与图像增强  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  PHP正则匹配日期和时间(时间戳转换)的实例代码  实现点击下箭头变上箭头来回切换的两种方法【推荐】  php 三元运算符实例详细介绍  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel Session怎么存储_Laravel Session驱动配置详解  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Android仿QQ列表左滑删除操作  如何快速搭建高效香港服务器网站?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何在阿里云ECS服务器部署织梦CMS网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何用花生壳三步快速搭建专属网站?  如何在搬瓦工VPS快速搭建网站?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  phpredis提高消息队列的实时性方法(推荐)  如何在云主机快速搭建网站站点?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  python中快速进行多个字符替换的方法小结  Laravel怎么实现模型属性的自动加密  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  微信小程序 wx.uploadFile无法上传解决办法  如何撰写建站申请书?关键要点有哪些?