JavaScript getter setter 怎么用
你有没有遇到过这种情况:想给对象的某个属性设置值时,得加一层判断,比如不能把年龄设成负数;或者想读取属性时,需要计算一下两个数的和再返回?这时候用普通的点语法就显得很麻烦,而JavaScript里的getter和setter,就是专门帮你解决这类问题的“小工具”,用法简单还接地气。
什么是getter和setter?
简单说,getter是“拿值的入口”,setter是“设值的出口”。你不用直接读写对象的属性,而是通过这两个方法来操作,中间还能加一些小规则——就像给家门装了门禁:只有输入正确密码(通过setter的判断)才能进门,拿快递(通过getter)也得走专门的取件口,不能直接翻窗户。

举个生活化的例子:你有一个记账本对象,里面有个“总收入”属性,它不是固定的数字,而是靠工资、兼职收入加起来的。如果直接存成固定数值,哪天加了兼职收入,你得手动改总收入,很容易忘。这时候用getter就方便了:每次读总收入的时候,它会自动把工资和兼职收入加起来给你,不用你手动算。
怎么用getter?
getter的作用是“获取”属性值,写的时候要在方法前加get关键字,后面跟属性名(注意不用加括号),方法里返回你要的结果。
还是用记账本的例子,假设记账本有salary(工资)和sideIncome(兼职收入)两个属性,要做“自动算总收入”的getter:
`javascript
const book = {
salary: 5000,
sideIncome: 1000,
// 定义getter,属性名叫totalIncome
get totalIncome() {
return this.salary + this.sideIncome;
}
};
`
这时候你读book.totalIncome,不用调用方法,直接像属性一样用:console.log(book.totalIncome),结果就是6000,哪怕后来改了sideIncome,比如加200,再读一次就自动变成7000,完全不用手动更新。
怎么用setter?
setter的作用是“设置”属性值,方法前加set关键字,后面跟属性名,参数就是你要设置的值,方法里可以加判断逻辑。
比如你有一个记录年龄的属性,不能设成负数,也不能超过150(毕竟人的寿命有限),用setter就能加这个限制:
`javascript
const person = {
_age: 0, // 注意:这里属性名加了下划线,是约定俗成的“私有属性”,别直接用它
set age(newVal) {
// 加判断:新值得是0到150之间的整数
if (typeof newVal === 'number' && newVal >=0 && newVal <=150 && Number.isInteger(newVal)) {
this._age = newVal;
} else {
console.log('年龄输入不合法,只能是0-150之间的整数');
}
}
};
`
这时候你给age赋值,就会触发setter的判断:person.age = 25,没问题,内部_age变成25;要是你写person.age = -5,就会弹出提示,不会把错误的负数存进去,比普通赋值安全多了。
这里要注意,为什么用_age?因为如果把属性名直接叫age,setter的方法名也是age,就会出现“自己调用自己”的死循环——你给age赋值,就会触发setter,而setter又给this.age赋值,等于又触发setter,永远停不下来。加下划线是大家约定的“这个属性是内部用的,别直接碰”,就像便利店的收银台,外人只能走付款通道(setter),不能直接碰里面的钱(_age)。
实际用的时候要注意啥?
- 不能同时用getter/setter和普通同名属性:比如你已经定义了
totalIncome是普通属性,又写getter,会报错,因为两者是“冲突”的,就像一个门不能既是自动门又手动开门。 - 按需使用:如果只是存固定值,没必要用getter/setter,不然反而麻烦,就像你只是买一瓶水,不用特意绕去专属通道,反而浪费时间。
- getter不要做复杂操作:它是“拿值的入口”,只负责返回值就行,别在里面改别的属性,不然读个值还触发一堆操作,容易出bug,就像你取快递,取件口只负责给你快递,不能顺便把你的雨伞也拿走。
学会getter和setter,相当于给对象的属性加了“智能门禁”,既能简化代码,又能保证数据的合理性,写代码的时候多想想什么时候该用它,就能少踩很多数据错误的坑。