JavaScript中getter和setter方法有什么作用?相关下划线命名是什么含义?
JavaScript getter/setter 相关问题解答
一、getter/setter 的具体功能
getter 是用 get 关键字定义的方法,作用是在读取对象属性时自动触发,返回自定义的计算结果,不需要主动调用方法,直接像读取普通属性一样使用即可。
setter 是用 set 关键字定义的方法,作用是在给对象属性赋值时自动触发,可以对要赋的值做校验、预处理后再存储,同样支持直接像给普通属性赋值一样使用,无需主动调用方法。
参考示例代码:
const person = { // 内部存储实际值的属性 _age: 0, // 读取age属性时自动触发该getter get age() { return this._age }, // 给age属性赋值时自动触发该setter set age(value) { // 赋值前做合法性校验 if (value < 0 || value > 120) { throw new Error('年龄取值不合法') } this._age = value } } person.age = 25 // 自动触发setter,校验通过后赋值 console.log(person.age) // 自动触发getter,输出25 person.age = 150 // 自动触发setter,校验不通过抛出错误
二、getter/setter 的使用优势
- 封装内部逻辑,对外暴露更简洁的属性调用方式,不需要用户主动调用
getXxx()/setXxx()这类方法,符合普通属性的读写习惯 - 可在属性读写时自动插入自定义逻辑:比如赋值前做合法性校验、读取时做动态计算、修改属性时自动触发关联更新(比如修改了宽度参数,自动同步更新DOM元素的宽度样式)
- 灵活控制属性的读写权限:只定义getter不定义setter,即可实现只读属性,避免外部意外篡改内部状态
- 兼容性好:如果后续需要给原本的普通属性增加读写逻辑,改成getter/setter之后,外部的调用代码不需要做任何修改,不会出现兼容性问题
三、下划线前缀命名的含义
这是JS开发者约定俗成的命名规范,不属于语法强制要求的规则。
因为getter/setter需要对外暴露一个和内部存储属性不同的名称,比如对外暴露age,内部实际存值的属性就加下划线命名为_age,用来提示所有开发者:这个属性是对象的内部私有属性,不要直接在对象外部读写该属性,应该通过对外暴露的getter/setter操作。
目前ES6+已经推出原生私有属性语法(用#开头的属性),但下划线命名的方式因为兼容性好、写法简单,仍然被广泛使用。
内容的提问来源于stack exchange,提问作者Shyan Akarsha
相关产品推荐
相关产品推荐

