最常用有效的方法是在构造函数内用 this instanceof constructorname 判断并兜底 new;严格模式使 this 为 undefined 而报错;class 配合静态 create 方法避免 new;typescript 加类型约束和 eslint 提前拦截。

直接在构造函数内部做判断,是最常用也最有效的做法——不依赖调用者记不记得写 new,而是让函数自己兜底。
检查 this 是否为实例对象
在函数开头用 this instanceof ConstructorName 判断当前调用是否通过 new。如果不是,就手动补上 new 并返回新实例:
- 确保
this指向正确对象,避免属性挂到window或globalThis上 - 适用于所有非箭头函数的构造函数(箭头函数不能用
new,本身就不该当构造函数) - 注意递归调用时别漏掉参数传递,否则会丢失初始化值
启用严格模式("use strict")
在函数体顶部加上 "use strict",能让忘记 new 的调用直接报错,而不是静默污染全局:
- 非严格模式下,
this会默认绑定到全局对象;严格模式下,this为undefined,赋值会抛出TypeError - 虽然报错看起来“不友好”,但能快速暴露问题,比后期排查全局变量被覆盖要高效得多
- 建议整个项目统一开启,不只是构造函数里加
改用 class 语法 + 静态工厂方法
ES6 的 class 本身不支持无 new 调用(会直接报错),但可以配合静态方法提供更友好的创建入口:
- 把实际逻辑放在
class内部,保证封装性和this安全 - 定义一个静态方法如
create(),内部调用new MyClass(...),对外只暴露这个方法 - 调用者只需写
MyClass.create(...),彻底绕过new记忆负担
借助 TypeScript 编译时约束
如果项目已用 TypeScript,可通过类型系统提前拦截错误:
- 声明构造函数类型时,明确标注其只能作为构造器使用(如
new (x: string) => Foo) - 配合 ESLint 规则
@typescript-eslint/no-misused-new,在编辑器和 CI 中提示误用 - 虽不能阻止运行时调用,但大幅降低人为失误概率
这些方法可以单独使用,也可以组合:比如 class + 严格模式 + TypeScript,三层防护基本覆盖所有常见疏漏场景。











