数据代理Object.defineProperty()
2024-09-01 09:03:02
数据代理: 通过一个对象代理对另一个对象中属性的操作(读/写)
数据代理
Object.defineProperty()
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
Object.defineProperty(obj, prop, desc)
- obj 需要定义属性的当前对象
- prop 当前需要定义的属性名
- desc 属性描述符
属性描述符
数据描述符
configurable:是否可以重新定义
enumerable:是否可以枚举
value:初始值
writable:是否可以修改属性值
访问描述符
- get:是一个回调函数,根据其他相关的属性动态计算得到当前属性值
- set:也是一个回调函数,监视当前属性值的变化,更新其他相关的属性值
<script type="text/javascript" >
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)
number = value
}
})
// console.log(Object.keys(person))
</script>
VUE中的数据代理
Vue中的数据代理:通过实例对象vm来代理data对象中属性的操作(读/写)
基本原理:
- 通过Object.defineProperty()把data对象中所有属性添加到vm上。
- 为每一个添加到vm上的属性,都指定一个getter/setter。
- 在getter/setter内部去操作(读/写)data中对应的属性。
//通过一个对象代理对另一个对象中属性的操作(读/写)-->
let obj = {x:100}
let obj2 = {y:200}
Object.defineProperty(obj2,'x',{
get(){
return obj.x
},
set(value){
obj.x = value
}
})
最新文章
- java设计模式之策略模式
- 第12章 Java字符串
- Install Houdini 12.5 x64 in CentOS 7
- Java基础(9):Java生成随机数一定范围内的数的一个典型例子
- uva514(trail)(模拟栈)
- lua for循环
- 一路走过的2013,welcome to 2014
- 模板方法模式(Template Pattern)
- unix 常用命令
- C/C++与lua实现互调
- Golang学习笔记:包制作
- kotlin, 一种新的android平台一级开发语言
- ruby如何查找一个方法属于哪个类
- Eclipse两种部署web项目方法
- Pre-shared key
- svn 使用教程
- C#获取Html中的图片元素路径
- linux VIM 下的语法高亮及自动缩进
- vuex是什么?怎么使用?哪种功能场景使用它?
- RabbitMQ Dead Lettering(死信)