js类class中get、set的运用

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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Pythonget和set的介绍和演示: 在Python,get和set是属性访问器,用于控制对属性的访问。get和set方法可以通过@property和@<attribute>.setter装饰器来实现。 1.使用@property装饰器实现get方法: ```python class MyClass: def __init__(self, value): self._value = value @property def value(self): print('Getting value...') return self._value ``` 在上面的代码,我们定义了一个名为value的属性,并使用@property装饰器将其转换为只读属性。当我们访问value属性时,会自动调用value方法。 2.使用@<attribute>.setter装饰器实现set方法: ```python class MyClass: def __init__(self, value): self._value = value @property def value(self): print('Getting value...') return self._value @value.setter def value(self, value): print('Setting value...') self._value = value ``` 在上面的代码,我们使用@value.setter装饰器定义了一个名为value的setter方法。当我们设置value属性时,会自动调用value方法。 3.使用get和set方法实现: ```python class MyClass: def __init__(self, value): self._value = value def get_value(self): print('Getting value...') return self._value def set_value(self, value): print('Setting value...') self._value = value value = property(get_value, set_value) ``` 在上面的代码,我们定义了一个名为value的属性,并使用property函数将其转换为只读属性。当我们访问value属性时,会自动调用get_value方法。当我们设置value属性时,会自动调用set_value方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值