简单的说,双向绑定是一种模式。让JS对象和DOM之间能够进行同步。
Object.defineProperty
在组件初始化的时候,会调用defineProperty去把属性转化为get,set。当访问数据,会调用get,由get的返回值来决定属性值。当修改数据时,会调用set里去指定修改的属性操作。
let person = {}
Object.defineProperty(person, 'name', {
get() {
return "王一"
},
set(value) {
console.log("有人想让我setter改名");
//参数value是可以用于新旧数据的修改的
}
});
console.log(person.name);//王一
person.name = "王二";//有人想让我setter改名
console.log(person.name);//王一
可以看出数据劫持的简单理解,当用户想访问person对象里的属性,get会调用并且以返回值的形式展现;当用户想修改person对象里的数据,也会调用set来执行其中的代码。在set里并没有做修改,所以对于其数据的修改并没有生效到name上,还是输出王一。
这个简单的例子可以帮助理解到Object.defineProperty解决的状态更变的问题。
当然后续如何触发通知,通知谁,在这里暂时没有详述。