JS —— 存取器属性get()和set()

上篇讲到可以用属性描述符来对属性做一些描述,以及用来描述属性的四个属性(value,configurable,enumerable,writable)。这篇讲的存取器属性就是在属性描述符中配置get()和set()方法,配置这两个方法之后,该属性就不是一个普通属性了。存取器属性最大的意义,在于可以控制属性的读取和赋值。

如果一个属性是存取器属性,则读取该属性时,会运行get方法,将get方法得到的返回值作为属性值,如果给该属性赋值,则会运行set方法。举个栗子来理解一下叭~

【例1】

const obj = {
    b:2
}
Object.defineProperty(obj,'a',{
    get() {
        console.log("运行了属性a的get函数")
    },
    set() {
        console.log("运行了属性a的set函数")
    }
})
obj.a = 10;
console.log(obj.a)

【结果】可以看到,在对a进行赋值时,运行了set(),在访问a时,运行了get(),且因为get函数没有返回值,所以得到的值为undefined

要想实现上面的效果,即赋的值等于读取到的值,可以借用第三参数,如下

const obj = {
    b:2
}
Object.defineProperty(obj,'a',{
    get() {
        console.log("运行了属性a的get函数");
        return obj._a;
    },
    set(val) {
        console.log("运行了属性a的set函数");
        obj._a = val;
    }
})
//以下代码相当于set(10)
obj.a = 10;
console.log(obj.a);

 【结果】

【注】get函数不能传参,set函数可以传一个参数

【例2】小练习:输入年龄,限定年龄范围在0-200岁,且输入必须为数字类型,输出XX岁。

obj = {
    name: 'jwh'
}
Object.defineProperty(obj, 'age', {
    get() {
        return `${obj._age}岁`;
    },
    set(val) {
        if (typeof val !== "number") {
            throw new TypeError("年龄必须是一个数字");
        }
        if (val < 0) {
            val = 0;
        } else if (val > 200) {
            val = 200;
        }
        obj._age = val;
    }
})
obj.age = 33;
console.log(obj.age);
obj.age = -10;
console.log(obj.age);
obj.age = 222;
console.log(obj.age);
obj.age = "aaa";
console.log(obj.age);

【结果】

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值