Menu
CoddyTech

验证与副作用

本课属于 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";  // 错误:年龄必须是数字

验证 = 在存储值之前检查它是否有效
副作用 = 属性变化时发生的其他操作

challenge icon

挑战

你会得到一个带有基本 setter 的 BankAccount 类。你的任务是完成 balance setter。

在 setter 中添加:

  1. 验证:检查 value 是否不是数字,或者是否小于 0。如果是,则使用 console.log("Invalid balance"),并用 return 退出 setter
  2. 副作用:存储有效值后,使用 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);

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: JavaScript 在线编译器