理解defineProperty
let obj
= {
}
let oldValue
= 'hyx';
Object
.defineProperty(obj
, 'name', {
configurable
: true,
enumerable
: true,
set(newValue
) {
if (newValue
!== oldValue
) {
oldValue
= newValue
;
console
.log("set方法被执行了");
}
},
get() {
console
.log("get方法被执行了");
return oldValue
;
}
})
实现监听所有属性的变化,事实监听
class Observer {
constructor(obj
) {
this.observe(obj
);
}
observe(obj
) {
if (obj
&& typeof obj
== 'object') {
for (let key
in obj
) {
this.defineRecative(obj
, key
, obj
[key
])
}
}
}
defineRecative(obj
, key
, value
) {
this.observe(value
);
Object
.defineProperty(
obj
, key
, {
configurable
: true,
enumerable
: true,
set: (newValue
) => {
if (value
!== newValue
) {
this.observe(newValue
);
value
= newValue
;
console
.log("监听到数据变化 set");
}
},
get() {
return value
;
}
}
)
}
}
let obj2
= {
name
: '汪苏泷'
}
new Observer(obj2
)
console
.log(obj2
);
注意里面递归调用了this.observe 测试 添加name的值为一个对象,则修改对象里面的属性的时候,set监听到数据的变化
转载请注明原文地址:https://tech.qufami.com/read-16969.html