构造函数中this指向新创建的实例,用于初始化独有属性和方法;实例属性互不影响,方法宜定义在原型上以节省内存,class的constructor作用相同但语法更清晰。

在 JavaScript 中,构造函数通过 this 关键字为新创建的实例设置初始属性和方法,从而初始化实例状态。
构造函数中用 this 赋值定义实例属性
在构造函数内部,给 this 添加属性,这些属性会成为每个实例独有的数据:
- 属性直接绑定到实例上,不同实例间互不影响
- 通常把需要独立维护的状态(如 name、age、items)放在这里初始化
- 避免在构造函数外直接修改原型上的可变对象(如数组、对象),否则可能引发共享状态问题
例如:
function Person(name, age) {this.name = name;
this.age = age;
this.skills = []; // 每个实例都有自己的空数组
}
在构造函数中初始化实例方法(可选)
虽然更推荐把方法定义在原型上以节省内存,但有时需要闭包或私有数据时,可在构造函数内定义方法:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次创建实例都会生成新函数,适合依赖当前实例状态且不希望被外部篡改的逻辑
- 注意性能开销,大量实例时慎用
例如:
function Counter(initial = 0) {this.value = initial;
this.increment = function() {
return ++this.value;
};
}
配合 class 语法的 constructor 更清晰
ES6 的 class 是构造函数的语法糖,constructor 方法作用相同,但结构更直观:
- 必须用 super() 调用父类构造函数(如果继承了 class)
- 可结合参数解构、默认值、展开运算符等现代特性简化初始化逻辑
- 静态属性或私有字段(#field)也可在 constructor 中参与状态设置
例如:
class TodoList {constructor(title = 'My List', items = []) {
this.title = title;
this.items = [...items]; // 浅拷贝避免共享
}
}
避免常见陷阱
初始化时容易忽略的细节:
- 不要在构造函数里直接给 this 赋值一个引用类型(如 {} 或 [])并期望它“私有”——除非每次都新建,否则多个实例可能共用同一对象
- 异步初始化(如 fetch 数据)不能直接在构造函数中 await,需改为工厂函数或显式调用 init() 方法
- TypeScript 中需确保声明的属性在 constructor 中被赋值,否则可能触发 strictPropertyInitialization 报错

















