美文网首页
MVC 和 MVVM

MVC 和 MVVM

作者: IF_123 | 来源:发表于2019-03-18 21:41 被阅读0次

一 MVC模式和MVVM模式

1.MVC模式
MVC是一种软件架构模式.把软件分为三层(Model, View, Controller)

  • model 用来存储数据,做数据的持久化

  • view 用来展示数据

  • controller 用来控制程序的流程


    MVC模式.png

2.MVVM模式
mvvm 分为model(模型) view(视图) viewModel(视图模型)

  • model 用来存储数据
  • view 用来展示数据
  • ViewModel 关联数据,和model实现双向绑定。


    MVVM模式.png

二 实现双向绑定

  • backbone 发布者订阅者模式
    一般通过sub, pub的方式实现数据和视图的绑定监听,更新数据方式通常做法是 vm.set('property', value)
  • angular 脏值检测
    angular.js 是通过脏值检测的方式比对数据是否有变更,来决定是否更新视图,最简单的方式就是通过 setInterval() 定时轮询检测数据变动,当然Google不会这么low,angular只有在指定的事件触发时进入脏值检测,大致如下:
DOM事件,譬如用户输入文本,点击按钮等。( ng-click )

XHR响应事件 ( $http )

浏览器Location变更事件 ( $location )

Timer事件( $timeout , $interval )

执行 $digest() 或 $apply()
  • vue 数据劫持(结合发布者订阅者的模式)
    vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

关于Object.defineProperty

语法:


Object.defineProperty(obj, prop, descriptor)

参数说明:

    obj:必需。目标对象
    prop:必需。需定义或修改的属性的名字
    descriptor:必需。目标属性所拥有的特性

返回值:

    传入函数的对象。即第一个参数obj

针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for..in或Object.keys()遍历。
给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述。

数据描述符

  • value
    属性对应的值,可以使任意类型的值,默认为undefined
  • writable
    属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false。
  • enumerable
    此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
  • configurable
    是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。

这个属性起到两个作用:

    目标属性是否可以使用delete删除
    目标属性是否可以再次设置特性

一旦使用Object.defineProperty给对象添加属性,那么如果不设置属性的特性,那么configurable、enumerable、writable这些值都为默认的false

存取描述
当使用存取器描述属性的特性的时候,允许设置以下特性属性:

var obj = {};
Object.defineProperty(obj,"newKey",{
get:function (){} | undefined,
set:function (value){} | undefined
configurable: true | false
enumerable: true | false
});

注意:当使用了getter或setter方法,不允许使用writable和value这两个属性

getter/setter

当设置或获取对象的某个属性的值的时候,可以提供getter/setter方法。

getter 是一种获得属性值的方法

setter是一种设置属性值的方法。

在特性中使用get/set属性来定义对应的方法。

var obj = {};
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
get:function (){
//当获取值的时候触发的函数
return initValue;
},
set:function (value){
//当设置值的时候触发的函数,设置的新值通过参数value拿到
initValue = value;
}
});
//获取值
console.log( obj.newKey ); //hello
//设置值
obj.newKey = 'change value';
console.log( obj.newKey ); //change value

configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
enumerable
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。

相关文章

网友评论

      本文标题:MVC 和 MVVM

      本文链接:https://www.haomeiwen.com/subject/auhimqtx.html