js中get,set用法
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);},};