通过Getter与Setter实现数据验证:Setter拦截赋值并校验类型、范围、格式等,非法时抛错或设默认值;Getter保障读取安全,如返回拷贝、占位符或格式化值。

通过 Getter 与 Setter 方法在赋值时实现数据有效性验证,核心是在 Setter 中拦截赋值操作,加入校验逻辑,校验失败则拒绝赋值(可抛出错误或设为默认值),而 Getter 通常用于统一读取逻辑(如返回只读副本、格式化值等),不直接参与验证,但可配合 Setter 构建完整的数据封装。
Setter 中做校验:拦截并控制赋值行为
Setter 是执行赋值的关键入口。所有对属性的写操作(如 obj.age = 25)都会触发它,因此适合集中做类型检查、范围限制、格式规范等验证:
- 检查数据类型是否符合预期(如必须为 number 或 string)
- 验证数值范围(如年龄应在 0–150 之间)
- 判断字符串是否为空、是否符合正则(如邮箱、手机号)
- 校验引用类型是否为有效对象或数组(避免赋值 null 或 undefined)
- 抛出
Error阻止非法赋值,或静默忽略/使用默认值(根据业务需求选择)
Getter 配合使用:确保读取安全与一致性
Getter 不负责验证输入,但能保障输出可靠。例如:
- 返回深拷贝对象,防止外部修改内部状态
- 对敏感字段(如密码)返回
undefined或占位符 - 自动格式化输出(如将时间戳转为 YYYY-MM-DD 字符串)
- 结合私有属性(如
#_age),让 Getter 总是返回经过 Setter 校验后的合法值
实际代码示例(ES6 Class + 私有字段)
以下是一个带完整验证的用户类:
class User {
#_name = '';
#_age = 0;
get name() {
return this.#_name.trim();
}
set name(value) {
if (typeof value !== 'string' || value.trim().length === 0) {
throw new Error('姓名必须是非空字符串');
}
this.#_name = value.trim();
}
get age() {
return this.#_age;
}
set age(value) {
if (!Number.isInteger(value) || value < 0 || value > 150) {
throw new Error('年龄必须是 0–150 之间的整数');
}
this.#_age = value;
}
}
// 使用
const u = new User();
u.name = ' Alice '; // ✅ 自动去空格,赋值成功
u.age = 30; // ✅ 合法数值
u.age = -5; // ❌ 抛出错误:年龄必须是 0–150 之间的整数
注意事项与进阶建议
- 避免在 Setter 中做耗时操作(如 API 请求、复杂计算),否则会影响赋值性能
- 若需支持批量初始化(如构造函数传参),应在构造器中调用 Setter,而非直接赋值私有字段,以保证验证逻辑一致
- TypeScript 中,Getter/Setter 的类型需显式声明,且 get/set 类型必须兼容,否则编译报错
- 对于数组或对象类属性,校验应深入一层(如检查数组长度、对象必填字段),必要时用工具函数辅助

















