【原生js实现MVVM核心框架】

MVC是一种框架模式,也是在学习前端时最先接触的框架模式,而MVP与MVVM都是在MVC的基础之上演化而来,三者各有优劣,本文主要按照下面思维导图进行介绍。

一、mvc mvp mvvm设计理念

1.Model-View-Controller (MVC)

· Model —— 负责应用的业务逻辑。它管理着应用的状态。这还包括读取和写入数据,持久化应用程序状态,甚至可能包括与数据管理相关的任务,例如网络和数据验证。

· View —— 这部分有两个重要的任务:向用户展示数据和处理用户和应用的交互。

· Controller —— view 层和 model 层经由一个或多个 controller 绑定在一起。

2.Model-View-Presenter (MVP)

· Model —— model 代表一组描述业务逻辑和数据的类。它制定了更改和操作数据的规则。

· View —— view 负责与用户进行交互。它与流程中要实现的逻辑无关。

· Presenter —— presenter 从 View 获取输入,在 model 的帮助下处理数据,并在处理完成后将结果传递回 view。

3.Model-View-ViewModel (MVVM)

· Model —— MVVM 中的 model 层和 MVC 中的 model 层非常相似,包含了供应用正常运转所需的基本数据。

· View —— view 层是用户和设计模式之间的图形界面,类似于 MVC 中的 view 层。用来展示处理后的数据。

· View-Model —— view-model 既是视图层的抽象,又提供了要访问的模型数据的包装。 也就是说,它包含一个可以被转换为视图的模型,并且还包含了一些命令,视图层可以使用这些命令更改模型。

二、mvc mvp mvvm对比

性能上的评估 —— 当我们测试 UI 的性能时,就渲染帧而言,可以认为 MVP 是其中可靠性最高,阻塞最小的了。MVVM 中的数据绑定会产生额外的过载,很可能导致在执行复杂任务时性能严重下降。

兼容性 —— 当测试它们的兼容性时,MVVM 是其中最好的,这得益于它的数据绑定。MVP 的表现要好于 MVC,后者存在严重的重启问题。

拓展性 —— 说起设计模式,它们必须要有一定的拓展性,因此我们才可以在应用中不断添加新的功能和策略。由以上几点得知,MVP 和 MVVM 的区别较小,不过 MVVM 的可维护性略胜一筹。多数情况下,每次后续的拓展,采用 MVC 模式的应用需要改动更多的地方。

引用 —— 在 MVC 中,view 未直接引用 controller,而在 MVP 中,视图引用了 presenter,在 MVVM 中,view 引用了 view-model。

应用入口 —— 对于 MVC,应用程序的入口是 controller,而对于 MVP 和 MVVM,入口是 view。

三、原生js实现MVVM核心框架

1.基本定义
Object.defineProperty普通声明对象,定义和修改属性

语法:

Object.defineProperty(obj,prop,descriptor)

obj:要处理的目标对象

prop:要定义或修改的属性的名称

descriptor:将被定义或修改的属性描述符

描述符 descriptor有两种形式:数据描述符和存储描述符,他们两个共有属性:

configurable,是否可删除,默认为false,定义后无法修改

enumerable,是否可遍历,默认为false,定以后无法修改

数据描述符 value:该属性对应的值,默认为undefined。 writable:当且紧当为true时,value才能被赋值运算符改变。默认为false。

writable和configurable的区别是前者是value能否被修改,后者是value能否被删除。

存储描述符 get():一个给属性提供getter的方法,默认为undefined。 set():一个给属性提供setter的方法,默认为undefined。

共有属性 configurable设置为false时,其内部属性无法用delete删除;如要删除,需要把configurable设置为true。

注意:数据描述符和存储描述符不能同时存在,否则会报错

数据拦截 使用Object.defineProperty来实现数据拦截,从而实现数据监听。

换句话说,就是data内部的属性都被我们监控的,当调用属性时,就可以在上面做些手脚,使得返回的值变掉;当设置属性时,不给他设置。

当然这样做很无聊,只是想说明,我们可以在内部做手脚,实现我们想要的结果。

那observe这个函数应该怎么写呢?

2.观察者模式

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式

Subject 是构造函数,new Subject()创建一个主题对象,它维护订阅该主题的一个观察者数组数组,主题上有一些方法,如添加观察者addObserver、删除观察者removeObserver、通知观察者更新notify

Observer是构造函数,new Observer() 创建一个观察者对象,该对象有一个update方法,当调用notify时实际上调用全部观察者observer自身的update方法是构造函数

举例来说:Subject 是腾讯推出的公众号,new Subject() 是一个某个机构的公众号——新世相,它要维护订阅这个公众号的用户群体,新世相将用户分为两组,一组是忠粉就是 addObserver,一组是黑名单就是:removeObserver,它在忠粉组可以添加用户,可以在黑名单里拉黑一些杠精,如果有福利发放,它就会统治忠粉里的用户:notify。Observer 是忠粉用户群体,new Observer()是某个具体的用户——小王,他必须要打开流量才能收到新世相的福利推送:updata

主题添加观察者的方法subject.addObserver(observer)很繁琐,直接给观察者下方权限,给他们增加添加进忠粉组的权限

参考文献:

MVC,MVP,MVVM 对比

MVC,MVP 和 MVVM 的图示

用原生 JS 实现 MVVM 框架1——观察者模式和数据监控

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值