Vue的Object.defineProperty()方法

4 篇文章 0 订阅

一、Object.defineProperty() 的作用

可以对添加的对象的属性添加一些高级的限制

let person = {
	name: '小明',
	sex: '男'
	// age: 18
}
Object.defineProperty(person,'age',{
	value: 18,
	enumerable: true, // 控制属性可以枚举,默认值是false
	writable: true, // 控制属性是否可以被修改,默认值是false
	configurable: true, // 控制属性是否可以被删除,默认值是false
	// 下面两个函数 将会在后面解释
	setter...,
	getter...
})

二、定义在Object.defineProperty()中的getter(get函数)

<script>
 let number = 18
 let person = {
    name: '小明',
    sex: '男',
    // age: 18
 }
 // 添加的属性不可遍历(为浅色)(不可枚举  zlzl)
 // 作用:可以对添加的对象的属性添加一些高级限制
 Object.defineProperty(person, 'age', {
      // value: 18,
      // enumerable: true, // 控制属性可以枚举,默认值是false
      // writable: true, // 控制属性是否可以被修改,默认值是false
      // configurable: true, // 控制属性是否可以被删除,默认值是false

      // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
      get: function() {
          console.log('有人读取age属性了');
          return number
      }
     })
     // 遍历person中的属性,输出一个数组
 console.log(Object.keys(person));
 console.log(person);
</script>

操作:使用Object.defineProperty() 方法,其中给person对象添加age方法,在其中定义getter(get函数)。
作用
① 当读取person的age属性时,getter就会被调用,返回值为age的值。(先调用getter,再返回age的值。)
② 当将age的值设为变量number时,只有这种写法,将 number的值赋给age 写在getter中,才会使当修改number的值时,age的值也发生改变。
在这里插入图片描述

三、定义在Object.defineProperty() 中的setter(set函数)

let number = 18
let person = {
	name: '小明',
	sex: '男'
}
 Object.defineProperty(person, 'age', {
    // value: 18,
    // enumerable: true, // 控制属性可以枚举,默认值是false
    // writable: true, // 控制属性是否可以被修改,默认值是false
    // configurable: true, // 控制属性是否可以被删除,默认值是false

    // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
    get() {
        console.log('有人读取age属性了');
        return number
    },
    // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
    set(value) {
		console.log('有人修改了age属性,且值是',value)
    }
})

在这里插入图片描述
由上述代码可见,set函数并没有修改成功age属性,后来获取的person.age的值仍然是18。
这是因为,age的值仍然依赖于上面的number变量,由于number变量的值没有变,所以person.age的值也没变。

那么我们需要怎么做,在age依赖变量number的情况下,才能成功修改age的值呢?相信聪明的小伙伴们已经想到了,那就是在setter中写这么一句:number = value,就能成功修改age的值了。

修改后代码产生的效果如下图所示:
在这里插入图片描述
相信聪明的小伙伴一眼就看出,这是不是和Vue的双向绑定是不是有些像呢?给大家留些悬念,我们下一期见 ~ ❀❀❀

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杉菜酱子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值