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);
下划线属性的意义
_model、_energyLevel、_numOfSensors是JS里约定俗成的“私有属性”——JS本身没有真正的私有属性(除非用#前缀),下划线只是给开发者的提示:「别直接改我,用对应的访问器操作」。但技术上你完全可以直接修改这些属性,只是会绕开校验逻辑。Getter的作用
get numOfSensors()定义了一个访问器属性:
- 当你执行
console.log(robot.numOfSensors)时,不是直接读取_numOfSensors的值,而是调用这个get函数。 - 函数内部会检查
_numOfSensors的类型:如果是数字,返回它的值;如果不是(比如你直接把_numOfSensors改成字符串),就返回错误提示。
- 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
相关产品推荐
相关产品推荐

