https://blog.csdn.net/lizidemao/article/details/83751690
实现mvvm的双向绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。就必须要实现以下几点:
1、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
ECMScript中有两种属性
①.数据属性:包含一数据值的位置,属性:
Configurable: 能否delete、修改、或者把属性修改成访问器属性 (默认值:true)
Enumberable: 能否通过for in 循环返回属性 (true)
Writable: 能否修改属性值 (true)
Value: 属性的数据值(undefined)
要修改属性默认的特性,必须使用ES5里的Object.defineProperty()方法,接收三个参数:属性所在对象、属性名、描述符对象(属性必须是以上四个值的一个或多个)
②.访问器属性:只包含一对getter(读取调用,返回有效值)和setter(写入调用)函数
访问器属性特性:
Configurable (同上,默认true )
Enumberable (true)
Get :读取属性是调用的函数,(undefined)
Set: 写入属性时调用的函数
注意: 访问器不能直接定义,必须使用Object.defineProperty()来定义
实现数据双向绑定的核心就是利用为每一个属性都创建了订阅者的实例对象, 以便观察, getter函数里面返回一个value值,在setter函数中写入修改后的值并调用update方法更新视图的数据值
Object.defineProperty( 目标对象,属性,描述)
定义对象上属性的一些特性
var obj2 = {};
Object.defineProperty(obj2, "age", {
value: 2, //属性值
writable: true, //对象上属性是否可修改
configurable: true, // 是否可配置,为false,不可(删、写、枚举)操作
enumerable: true // 是否可通过for in 遍历枚举该对象
});
console.log(obj2.age); // 2