js里class有get和set两种修饰符,其中有几点注意事项:
1.get可以修改对象的属性,尽量注意不要做以下操作,比如:
class Obj {
c=1
get a(){
this.c = "修改后的c"
return "a的值"
}
}
const obj = new Obj()
obj.a //此时obj.c为"修改后的c"
2.set不要修改自身,这样会导致递归爆栈,比如:
set a(val){
this.a=xx //这样会导致递归,obj.a="newValue"修改a时调用set a(),在调用set a()时又修改a,很明显会无限递归
}
3.因为set a无法直接修改get a返回的值,所以需要先通过一个第三方对象属性来缓存set a的结果来供get a调用,这类似于交换两个变量的做法,比如:
class Obj {
c="我是a的缓存",
get a(){
return this.c
},
set a(val){
this.c=val //在这里我们可以通过改变this.c中的的内容,
//间接改变get a
//这样读取obj.a时的内容就会是我们想要的内容了,
}
}
const obj = new Obj()
还可以在上面的基础上结合typescript,为Obj.c添加上private或protect关键字,防止Obj.c被意外修改
class Obj {
private c="我是a的缓存" //添加private或者protect之后this.c无法在类外部访问修改,可以起到保护作用
get a(){
return this.c
}
set a(val){
this.c=val //在这里我们可以通过改变this.c中的的内容,
//间接改变get a
//这样读取obj.a时的内容就会是我们想要的内容了,
}
}
const obj = new Obj()
private和protect 的区别是:private只能在类中修改访问,protect只能在类和子类中修改访问
与private、protect平级的还有public,public修饰的属性可以在类、子类、类外修改访问
private、protect 、public都只影响编译时,不影响运行时。也就是说想强行访问修改private、protect修饰的属性还是可以做到的,不会在运行时报错导致程序崩溃。报错只会在编写代码时报错。这三个typescript关键字没什么实际上的约束力
4.class里不要有与get、set同名的属性,有的话会导致get、set不被触发
class Obj {
a=123
get a(){
console.log("触发get a")
return 1
}
set a(val){
console.log("触发set a")
}
}
const obj =new Obj()
obj.a //此时get a不触发 a的值为123
obj.a=3 //此时 set a不触发 a的值为123