当前位置:网站首页>Object.defineProperty新增/修改属性数据代理
Object.defineProperty新增/修改属性数据代理
2022-08-11 05:17:00 【-加油】
1、给对象添加属性
<script type="text/javascript">
let person = {
name:'庄文杰',
sex:'男'
}
//给对象添加属性 参数:给哪个对象添加属性、属性名、配置项
Object.defineProperty(person,'age',{
value:18
})
//其中age是不可枚举的,不参与遍历的
console.log(person);
console.log(Object.keys(person));
</script>
配置项再加上enumerable:true就可枚举了,还有其他的:
//给对象添加属性 参数:给哪个对象添加属性、属性名、配置项
Object.defineProperty(person,'age',{
value:18,
enumerable:true,//是否可以枚举,默认是false
writable:true,//是否可以被修改,默认为false
configurable:true,//是否可以被删除,默认为false
})
修改num,不会影响到属性age,但希望修改num可以影响修改到age。
<script type="text/javascript">
let num = 18;
let person = {
name:'庄文杰',
sex:'男',
age:num,
}
console.log(person.age);//18
//修改num的值,不会影响到person中
num = 19;
console.log(person.age);//18
</script>
要age随num改变只能通过:修改num后,再重新赋值
num = 19;
//只能这么修改
person.age = num;
console.log(person.age);
这时我们要实现num变化,age自动变,
不需要再通过
person.age = num;去重新赋值
getter函数:
let num = 18;
let person = {
name:'庄文杰',
sex:'男',
}
Object.defineProperty(person,'age',{
//当读取person的age属性时,get函数就会被调用,且返回值就是age的值
get:function(){
console.log('有人读取了age');
return num
},
})
console.log(person.age);//调用了get函数 输出18
num = 19;
//每次访问age都会调用get 在函数中return num 的num 也为最新值
console.log(person.age);//调用了get函数 输出19
除了有getter,还有setter:
let num = 18;
let person = {
name:'庄文杰',
sex:'男',
}
Object.defineProperty(person,'age',{
//当读取person的age属性时,get函数就会被调用,且返回值就是age的值
get:function(){
console.log('有人读取了age');
return num
},
//当修改person的age属性时,set函数就会被调用,且收到修改的具体值value
set(value){
console.log('有人修改了age为'+value);
num = value
}
})
person.age = 19;//调用了 set 修改age
console.log(person);
数据代理:通过一个对象 代理 对另一个对象中属性的操作
let obj1 = {
x:100};
let obj2 = {
y:300};
//通过 obj2 代理 对 obj1 属性 x 的操作
Object.defineProperty(obj2,'x',{
get(){
console.log(`读取了obj1.x属性:${
obj1.x}`);
return obj1.x;
},
set(val){
obj1.x = val
console.log(`修改了obj1.x属性:${
obj1.x}`);
}
})
console.log(obj2);//{ y: 300 }
obj2.x;//读取了x属性
obj2.x = 800;//同时修改了obj1的x
console.log(obj1);//{ x: 800 }
console.log(obj2);//{ y: 300 }
边栏推荐
猜你喜欢

flask框架学习:debug与配置项

(1) Docker installs Redis in practice (one master, two slaves, three sentinels)

【win10+cuda7.5+cudnn6.0安装caffe②】安装Visual Studio 2013和caffe

task05 PyTorch可视化

【网站小白】Hibernate插入数据成功,不报错,但是数据库中没有值

吃瓜教程task01 第1章 绪论

(一)性能实时监控平台搭建(Grafana+Influxdb+Jmeter)

(2) Docker installs Redis in practice (persistent AOF and RDB snapshots)

软件测试风险识别

RK3399上的Tengine实践笔记
随机推荐
(1) Docker installs Redis in practice (one master, two slaves, three sentinels)
C语言——程序的编译与执行、宏定义详解
Introduction of several ways to initialize two-dimensional arrays in C language (private way to initialize large arrays)
第10章 对象和类 -1
04-开发自己的npm包及发布流程详细讲解
【win10+cuda7.5+cudnn6.0安装caffe③】编译及测试caffe
leetcode21. Merge two ordered linked lists
【无标题】
搭建PX4开发环境
task06 PyTorch生态
leetcode21.合并两个有序链表
【win10+cuda7.5+cudnn6.0安装caffe②】安装Visual Studio 2013和caffe
Some Error in Visual Studio solution
c pointer learning (1)
05-JS中的BOM和DOM
C语言——文件操作(2)文件的读写操作
第8章 函数探幽-2
lspci 命令使用
普林斯顿概率论读本读书笔记(阅读中......)
程序员小白的自我救赎之路。