You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类构造函数存在同名存取器时如何添加属性?Cube类构建求助

实现Cube类的解决方案

你的问题核心在于:类中定义的surfaceArea和volume是访问器属性(通过get/set定义),而非普通的数据属性,所以构造函数里直接赋值this.surfaceArea = ...只会触发对应的setter,但你的setter是空实现,导致没有任何实际效果;同时空的getter也会让读取这两个属性时返回undefined。

要实现“修改任意一个属性,另外两个自动更新”的Cube类,核心是用一个核心属性(比如边长length)作为基准,另外两个属性通过计算得到,同时给三个属性都配置合法的getter和setter:

class Cube {
  // 用私有字段存储核心边长,避免外部直接修改破坏数据一致性
  #length;

  constructor(length) {
    // 通过length的setter初始化,自动触发合法性校验
    this.length = length;
  }

  // 边长的getter和setter
  get length() {
    return this.#length;
  }

  set length(value) {
    // 校验输入合法性
    if (typeof value !== 'number' || value <= 0) {
      throw new Error('边长必须是大于0的数字');
    }
    this.#length = value;
  }

  // 表面积的getter和setter
  get surfaceArea() {
    // 基于边长计算表面积:6 * 边长²
    return this.#length ** 2 * 6;
  }

  set surfaceArea(value) {
    if (typeof value !== 'number' || value <= 0) {
      throw new Error('表面积必须是大于0的数字');
    }
    // 由表面积反推边长:边长 = √(表面积 / 6)
    this.#length = Math.sqrt(value / 6);
  }

  // 体积的getter和setter
  get volume() {
    // 基于边长计算体积:边长³
    return this.#length ** 3;
  }

  set volume(value) {
    if (typeof value !== 'number' || value <= 0) {
      throw new Error('体积必须是大于0的数字');
    }
    // 由体积反推边长:边长 = 三次根号体积
    this.#length = Math.cbrt(value);
  }
}

// 测试用例
const cube = new Cube(1);
console.log(cube.length); // 1
console.log(cube.surfaceArea); // 6
console.log(cube.volume); // 1

// 修改表面积,自动更新边长和体积
cube.surfaceArea = 24;
console.log(cube.length); // 2
console.log(cube.volume); // 8

// 修改体积,自动更新边长和表面积
cube.volume = 27;
console.log(cube.length); // 3
console.log(cube.surfaceArea); // 54

关键说明

  1. 访问器属性的作用:surfaceArea和volume不再存储实际值,而是通过getter实时计算,确保始终与length保持一致;setter则负责根据输入值反推length,从而联动更新另外两个属性。
  2. 私有字段的优势:#length是ES6+的私有字段,外部无法直接访问或修改,只能通过类提供的getter/setter操作,避免了数据被非法修改导致的不一致问题。
  3. 合法性校验:每个setter都加入了输入校验,确保属性值始终符合立方体的物理逻辑。

内容的提问来源于stack exchange,提问作者Sundozer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:40:11