验证与副作用
本课属于 Coddy JavaScript 学习旅程的“面向对象编程”单元。第 45 课,共 56 课。
getter 和 setter 不仅可以读取和写入属性,还可以验证输入,并在值发生变化时触发副作用。
我们来创建一个带验证功能的 User 类:
class User {
constructor(name, age) {
this._name = name;
this._age = age;
}
get age() {
return this._age;
}
set age(value) {
// 检查 age 是否为数字,且在合理范围内
if (typeof value !== 'number') {
throw new Error('Age must be a number');
}
if (value < 0 || value > 120) {
throw new Error('Age must be between 0 and 120');
}
this._age = value;
// 副作用:age 变化时记录日志
console.log(`Age updated to ${value}`);
}
}现在使用 setter 时,会自动进行验证:
const user = new User('Alice', 25);
// 这样可以正常运行
user.age = 30; // 日志输出:“Age updated to 30”
// 这会抛出错误
user.age = -5; // 错误:年龄必须在 0 到 120 之间
// 这也会抛出错误
user.age = "thirty"; // 错误:年龄必须是数字验证 = 在存储值之前检查它是否有效
副作用 = 属性变化时发生的其他操作
挑战
你会得到一个带有基本 setter 的 BankAccount 类。你的任务是完成 balance setter。
在 setter 中添加:
- 验证:检查
value是否不是数字,或者是否小于 0。如果是,则使用console.log("Invalid balance"),并用return退出 setter - 副作用:存储有效值后,使用
console.log(\`Balance updated to $${value}\`)
亲手试试
import { BankAccount } from './account.js';
// 测试用例
const account = new BankAccount("Savings");
// 测试 1:有效余额
account.balance = 100;
console.log(account.balance);
// 测试 2:Invalid balance(负数)
account.balance = -50;
console.log(account.balance);
// 测试 3:Invalid balance(不是数字)
account.balance = "abc";
console.log(account.balance);
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
8整理 OOP 代码
将类组织到模块中自己练习: JavaScript 在线编译器