严格模式下构造函数必须用 new 调用,否则 this 为 undefined 并报错;应通过 'use strict' 和 new.target 检测确保调用规范,统一返回逻辑,方法挂载到 prototype 并修复 constructor 指向。

在严格模式下,构造函数必须通过 new 调用,否则 this 会是 undefined,直接报错。要规范化实例化行为,核心是防止误调用、统一返回逻辑、明确上下文绑定。
强制使用 new 调用
严格模式本身已禁止不带 new 的构造函数调用(this 为 undefined,赋值失败)。但仅靠报错不够友好,可主动防御:
- 在构造函数首行加
'use strict',确保内部this不意外指向全局 - 用
new.target检测调用方式:若为undefined,说明没用new,可自动补全或抛出语义化错误 - 示例:
function Person(name) {
if (!new.target) throw new Error('Person must be called with new');
this.name = name;
}
统一返回逻辑,避免意外覆盖实例
构造函数中若有 return,需注意其行为:
- 返回原始值(如
return 42)会被忽略,仍返回新创建的实例 - 返回对象(如
return {name: 'Alice'})则完全替代默认实例 - 若希望始终返回实例,应避免返回对象;若需定制返回,务必明确文档化该行为
原型方法定义保持一致性
避免在构造函数内重复定义方法,提升性能和内存效率:
立即学习“Java免费学习笔记(深入)”;
- 把共享方法挂到
Constructor.prototype上,如Person.prototype.sayName = function() {...} - 若用对象字面量重写整个
prototype,记得手动修复constructor指向:
Person.prototype = {
constructor: Person,
sayName() { console.log(this.name); }
};
推荐初始化写法:结合严格模式与防御性检查
一个健壮的构造函数模板:
- 顶部启用严格模式
- 校验
new.target - 参数做基础类型/存在性检查(如
name非空字符串) - 用
Object.defineProperty控制属性特性(如只读、不可枚举) - 所有实例属性在构造函数内显式初始化,不依赖隐式挂载


















