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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐