最标准方式是在 constructor 中用 this.属性名 = 值 初始化;类字段语法(ES2022+)可在 constructor 前声明默认值,但不可访问未定义的 this 属性;避免原型上初始化引用类型、混淆静态属性、在构造函数中执行异步操作。

在 JavaScript 构造函数中初始化成员变量,最标准、推荐的方式是在 constructor 内部使用 this.属性名 = 值 语法直接赋值。
基础写法:在 constructor 中用 this 赋值
ES6 类语法下,所有实例属性都应在 constructor 中显式初始化,确保每个实例拥有独立副本:
class Person {
constructor(name, age) {
this.name = name; // 初始化字符串成员
this.age = age; // 初始化数值成员
this.skills = []; // 初始化引用类型(避免共享)
this.isActive = true; // 初始化布尔成员
}
}
⚠️ 注意:不要在类体顶层(constructor 外)直接写 this.xxx = ...,那会报语法错误。类体中只允许定义方法、getter/setter 或字段声明(见下一条)。
可选方案:类字段(Class Fields)语法(需注意兼容性)
现代 JavaScript(ES2022+,主流浏览器及 Node.js 16+ 支持)允许在类中直接声明实例字段,它们会在构造函数执行前自动初始化:
立即学习“Java免费学习笔记(深入)”;
class Person {
name = ''; // 字符串默认值
age = 0; // 数值默认值
skills = []; // 新数组(每个实例独立)
isActive = false; // 布尔默认值
constructor(name, age) {
this.name = name || this.name;
this.age = age ?? this.age;
}
}
✅ 优点:逻辑更清晰,尤其适合固定默认值;
❌ 注意:字段初始化发生在 constructor 执行前,因此不能访问 this 上尚未定义的其他属性或调用实例方法。
避免常见陷阱
-
不要在原型上初始化引用类型:比如
Person.prototype.data = [],会导致所有实例共享同一个数组。 -
区分实例属性和静态属性:用
static声明的是类级别属性,不属于实例,不通过this访问。 -
异步初始化需谨慎:构造函数必须同步返回实例,如需异步加载数据,应改用工厂函数或后续调用初始化方法(如
init())。
函数构造函数写法(传统方式,仍有效)
如果不用 class,而是用普通函数模拟构造器,同样通过 this 绑定:
function Person(name, age) {
this.name = name;
this.age = age;
this.skills = [];
}
// 使用 new 调用
const p = new Person('Alice', 30);
这种写法下,必须用 new 调用,否则 this 指向全局对象(非严格模式)或 undefined(严格模式),导致意外行为。


















