严格模式不影响new绑定,this始终指向新实例;其作用是让误调用person()时报typeerror而非绑定全局;真正防护需靠instanceof检查、class语法或typescript等主动措施。

构造函数在严格模式下不会隐式绑定到全局,根本不需要“防止”——因为默认绑定在 new 调用时本就不生效。真正要关注的,是避免把构造函数误当作普通函数调用。
严格模式对构造函数调用无影响
使用 new 关键字调用函数时,无论是否启用严格模式,this 都指向新创建的实例对象。严格模式不改变 new 绑定的优先级,它只约束其他绑定场景(如默认绑定)。
-
new Person()→this始终是新实例,与是否写"use strict"无关 - 严格模式真正起作用的是:当有人错误地写成
Person()(没加new)时,在严格模式下会立即报TypeError: this is undefined,而不是静默绑定到window或global
防止误调用为普通函数的实用做法
即使开了严格模式,也不能靠它“自动防护”,必须主动规避 Person() 这类错误调用。推荐以下方式:
- 在构造函数开头检查
this是否为当前类型的实例:if (!(this instanceof Person)) throw new Error('必须用 new 调用') - 返回一个显式对象(但注意:若返回非空对象,
this将被忽略;仅适用于需强制封装的场景) - 改用
class语法 ——class Person {}的构造器天然禁止非new调用,直接报TypeError: Class constructor Person cannot be invoked without 'new'
别依赖严格模式来“兜底”
严格模式让 Person() 报错,这比污染全局好,但它不是防御设计,而是故障暴露机制。错误发生在运行时,测试或上线后才触发,无法预防逻辑误用。
- 模块打包时,
new调用可能被混淆或 tree-shaking 干扰,静态检查更可靠 - 团队协作中,明确命名约定(如首字母大写的
Person)+ TypeScript 的new Person()类型校验,比纯 JS 严格模式更前置、更安全 - 如果函数本意就是可
new可普通调用(如工厂函数),那就应显式处理两种情况,而不是依赖this的隐式行为
本质上,构造函数的安全不来自严格模式,而来自调用意图的明确性与执行路径的可控性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











