美文网首页
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