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

JavaScript中getter/setter工作原理解惑:直接修改属性为何无报错?

JavaScript Getter/Setter 运行机制详解

核心问题拆解

你直接修改_numOfSensors没触发预期提示,是因为getter/setter只负责管控numOfSensors这个访问器属性,不管你直接操作_numOfSensors这个原始数据属性。下面一步步拆解这段代码的逻辑:

代码逐部分解析

先看你的代码:

const robot = {
  _model: "1E78V2",
  _energyLevel: 100,
  _numOfSensors: 15,
  get numOfSensors() {
    if (typeof this._numOfSensors === "number") {
      return this._numOfSensors;
    } else {
      return "Sensors are currently down.";
    }
  },
  set numOfSensors(num) {
    if (typeof num === "number" && num >= 0) {
      this._numOfSensors = num;
    } else {
      return "Pass in a number that is greater than or equal to 0";
    }
  },
};
robot.numOfSensors = 100;
console.log(robot.numOfSensors);
  1. 下划线属性的意义
    _model、_energyLevel、_numOfSensors是JS里约定俗成的“私有属性”——JS本身没有真正的私有属性(除非用#前缀),下划线只是给开发者的提示:「别直接改我,用对应的访问器操作」。但技术上你完全可以直接修改这些属性,只是会绕开校验逻辑。

  2. Getter的作用
    get numOfSensors()定义了一个访问器属性:

  • 当你执行console.log(robot.numOfSensors)时,不是直接读取_numOfSensors的值,而是调用这个get函数。
  • 函数内部会检查_numOfSensors的类型:如果是数字,返回它的值;如果不是(比如你直接把_numOfSensors改成字符串),就返回错误提示。
  1. Setter的作用
    set numOfSensors(num)是对应的设置逻辑:
  • 当你执行robot.numOfSensors = 100时,不是直接给_numOfSensors赋值,而是调用这个set函数,把100作为参数num传进去。
  • 函数会校验num是不是非负数字:符合条件就把值赋给_numOfSensors;不符合就返回提示(注意:setter里的返回值没有实际作用,因为赋值语句不会接收返回值,要真正抛出错误应该用throw new Error('提示内容'))。

你的疑问解答

  • 为什么直接改robot._numOfSensors = -5没提示?因为你跳过了setter,直接修改了底层的_numOfSensors,setter的校验逻辑根本没触发。
  • 如果你直接把_numOfSensors改成字符串,再执行console.log(robot.numOfSensors),就会触发getter的逻辑,返回“Sensors are currently down.”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:20:14