MVVM框架在目前的js开发中逐渐成为主流,我一直在想它是怎么做到这一点的,本着好奇和想深入学习的源故,经过一番研究,自己实现了一个非常简单的MVVM框架,本系列基本展示MVVM框架的设计思路,有其意,无其形,勉强可以一看。
从MVVM实现角度看,在真正开始代码之前,还需要具备一定的知识储备。
Object.defineProperty
通过Object.defineProperty
中的setter、getter来劫持model中各个属性,当数据在变动的时候发布数据的订阅者,触发相应的监听回调。Object.defineProperty
是ES5新增的一个API,vue2.0中使用它来做的双向数据绑定,关于它的知识建议直接看MDN(我是传送门)。
注意以下几点:
- configurable、enumerable和writable的默认值是false,value默认值undefined
- configuration可以控制configuration、enumeration和是否可删除
- configuration和writable、value的关系文章没有写的特别清除,下面的表格是我在chrome下测试的结果,你也可以试一试。两个结论:
- 只有在configuration和writable均为false的时候:writable不可修改的,defineProperty不可修改属性值
- 普通方式是否可以修改属性值,是由writable决定的
configuration | writable | writable是否可修改 | defineProperty是否可修改属性值 | 普通方式是否可修改属性值(a.b) |
---|---|---|---|---|
true | true | Yes | Yes | Yes |
true | false | Yes | Yes | No |
false | true | Yes | Yes | Yes |
false | false | No | No | No |
- 数据描述符和存取描述符是描述付的两种形式,必须是两者之一,不能混合使用
类型 | configurable | enumerable | value | writable | get | set |
---|---|---|---|---|---|---|
数据描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
理解观察者(发布订阅)模式
通过观察者模式化可以实现V和M之间的互相绑定,在MVVM初始化的时候view去订阅model中的属性,当订阅的属性发生变化的时候,去通知view做出更新。
网上有很多文章都在写观察者模式和发布订阅模式的区别,其实两者并无区别,两者并无区别,两者并无区别,重要的事情说三遍,从代码实现的角度去理解模式,从字面上去抠,没意思。
不理解这个模式的,可以去看这里
总结
介绍一下自己动手实现MVVM的准备知识,下一篇怎么通过Object.definePrototype
实现数据劫持。