在JavaScript中,Getters和Setters是允许你为对象的属性设置获取(get)值和设置(set)值时的自定义行为的一种方式。这种机制在ECMAScript 5(简称ES5)中引入,并在后续的ECMAScript版本中得到了广泛的支持,包括现代的浏览器和Node.js环境。
### 平台支持
- **浏览器**:几乎所有现代浏览器(如Chrome, Firefox, Safari, Edge等)都支持ES5及以上版本,因此它们完全支持Getters和Setters。然而,一些非常旧的浏览器(如IE8及以下版本)可能不支持。
- **Node.js**:从Node.js的早期版本开始,就支持ES5的功能,包括Getters和Setters。随着Node.js的不断发展,它对更新版本的ECMAScript的支持也越来越完善。
### 详细介绍
**Getters**:当你尝试访问一个对象的属性时,如果该属性被定义为一个getter,那么该属性的值将由getter函数返回,而不是直接返回存储在对象属性中的值。
**Setters**:当你尝试给对象的属性赋值时,如果该属性被定义为一个setter,那么不会直接修改对象中的属性值,而是会调用setter函数,该函数接收新值作为参数,并根据需要执行一些操作(如验证、格式化等)。
#### 示例代码
let obj = {
_prop: 'initial value',
get prop() {
console.log('Getter called');
return this._prop;
},
set prop(value) {
console.log('Setter called with:', value);
this._prop = value;
}
};
console.log(obj.prop); // 输出: Getter called,然后输出: initial value
obj.prop = 'new value'; // 输出: Setter called with: new value
console.log(obj.prop); // 再次输出: Getter called,然后输出: new value
在这个例子中,`_prop`是实际的存储属性,而`prop`是公开的访问器属性,它通过getter和setter来控制对`_prop`的访问和修改。
### 注意事项
- 使用Getters和Setters可以提供对对象属性的封装,有助于隐藏内部实现细节和保护数据。
- 它们可以引入额外的性能开销,因为每次访问或修改属性时都会调用函数。然而,在大多数情况下,这种开销是可以接受的。
- 在使用Getters和Setters时,应确保它们的行为符合预期,以避免引起混淆或错误。