在 javascript 中,使用 class 语法定义 setter 需要在类体内部声明一个以 set 关键字开头的方法。该方法必须接受一个参数用于接收赋值操作传入的值,并在方法体内通过 this 访问实例属性来存储该值。

setter 如何与 getter 配合实现属性拦截
当为类定义 setter 时,通常需要一个对应的 getter 来读取数据,从而形成完整的属性访问控制。通过同时定义 get 和 set 方法,可以拦截对属性的读写操作,并在赋值前进行逻辑处理,例如数据验证或格式转换。

class User {
constructor(name) {
this._name = name;
}
get name() {
return this._name.toUpperCase();
}
set name(value) {
if (typeof value !== 'string') {
throw new TypeError('Name must be a string');
}
this._name = value.trim();
}
}
const user = new User('Alice');
console.log(user.name); // ALICE
user.name = ' Bob ';
console.log(user.name); // BOBsetter 在继承中的行为表现
在子类中,如果重写了父类的 setter,可以直接调用 super.setter() 来复用父类的逻辑,或者完全替换它。如果子类没有显式定义 setter,但父类定义了,那么子类实例依然可以使用父类的 setter 进行赋值操作,前提是子类没有定义同名的属性遮蔽父类逻辑。
立即学习“Java免费学习笔记(深入)”;

class Animal {
constructor(type) {
this._type = type;
}
set type(value) {
this._type = value;
}
get type() {
return this._type;
}
}
class Dog extends Animal {
constructor(type, breed) {
super(type);
this.breed = breed;
}
set type(value) {
if (value !== 'dog') {
throw new Error('Only dogs allowed');
}
super.type = value;
}
}
const dog = new Dog('dog', 'Labrador');
dog.type = 'cat'; // Error: Only dogs allowed基于私有字段 # 的 setter 定义方式
在 ES2022 引入的私有字段(Private Fields)中,可以使用 # 前缀定义私有属性,并通过 setter 对其进行访问。这种方式提供了更强的封装性,外部代码无法直接访问这些属性,只能通过定义的 setter 和 getter 进行操作。


















