自己动手模拟MVVM之一预备姿势

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做出更新。

网上有很多文章都在写观察者模式和发布订阅模式的区别,其实两者并无区别,两者并无区别,两者并无区别,重要的事情说三遍,从代码实现的角度去理解模式,从字面上去抠,没意思。

不理解这个模式的,可以去看这里

我是传送门1
我是传送门2

总结

介绍一下自己动手实现MVVM的准备知识,下一篇怎么通过Object.definePrototype实现数据劫持。