1、作為對象的訪問器屬性
//使用Object.definePropertylet obj = {_a:'123'};Object.defineProperty(obj, "a", {get() {return this._a;},set(val) {this._a=val},});console.log(obj.a); //123obj.a='456'console.log(obj.a) // 456
//使用對象字面量let obj= {_a:'123',get a(){return this._a},set a(val){this._a=val}}console.log(obj.a); //123obj.a='456'console.log(obj.a) // 456
注意:訪問器屬性通常對應一個數據屬性,且不同名,否則可能會導致棧溢出。
2、作為class類的get,set函數,作為實例的訪問器屬性
class Test {constructor() {this.a='123'}get _a() {console.log('執行了get')return this.a}set _a(val) {console.log('執行了set')this.a = val;}}
注意:如果發生以下情況:定義一個屬性和獲取、設置函數同名,而且是直接寫在類塊中,set,get將會 失效。
class Test {_a='456'constructor() {this.a='123'}get _a() {console.log('執行了get')return this.a}set _a(val) {console.log('執行了set')this.a = val;}}
同樣,也要注意設置函數和獲取函數中訪問的值或設置的值不能和函數同名,否則一樣會棧溢出。
3、作為代理處理程序中的捕獲器函數。
let target = {};let handler = {get(target, prop) {return Reflect.get(...arguments);},set(target, prop, val) {Reflect.set(...arguments);},};