1.Object.defineProperty(obj,key,desc);

  用法:1.给对象新增属性和特性

     2.修改对象属性值和特性

      desc(属性特性):

        1.enumerable:boolean 可枚举

        2.writable :boolean 可写

        3.value:any 赋值

        4.get 取值

        5.set 改值

2.思路:

  对象的赋值和改值其实是通过Object.defineProperty的get和set特性来实现的,一般默认模式。

  通过改写属性的get和set的特性,来实现对一个对象的监听。

3.举例:

  

  1. var obj = {age:23};
  2. console.log(obj.age); //23
  3.  
  4. Object.defineProperty(obj,'age',{
  5. get(){
  6. return 24;
  7. }
  8. });
  9. console.log(obj.age); //24
  10.  
  11. obj.age = 25;
  12. console.log(obj.age); //24

  原理:对象属性和赋值取值都会触发自身的get和set特性。

4.实现:

  1. /*js 监听器*/
  2. var transi = "";
  3. function observe(obj,key){
  4. if(obj[key] && (typeof obj[key] == 'object')){
  5. Object.keys(obj[key]).forEach((v,index)=>{
  6. observe(obj[key],v,obj[key][v]);
  7. });
  8. } else {
  9. Object.defineProperty(obj,key,{
  10. set(newV){
  11. transi = newV;
  12. console.log('值改变');
  13. },
  14. get(){
  15. console.log('新值为' + transi);
  16. return transi;
  17. }
  18. })
  19. }
  20. }
  21. var obj = {name : 'wang',age:{max:12,good:{at:30}}};
  22. observe(window,'obj');
  23. obj.age.good.at = 44;
  24. console.log(obj.age.good.at);

 5.延伸:

  vue的双向绑定机制:当改变一个值时,在这个值的set特性中触发其他值的改变,实现数据实时更新的机制。

 6.核心:

  1.observer观察者: 观察一个对象,当某一属性改变时,触发set特性,由set触发与之关联的属性,哪些与之关联,怎么建立起关系?需要一个订阅者,即为一个数组,存放一些关联的对象。

  2.watcher订阅者: 订阅者需要自己的更新机制,在set中被触发时需要及时更新自己的数据,再渲染到页面上,需要complier来解析页面,实现view层改变。

  3.complier解析: 通过js获取指令模板,正则匹配换值,将操作封装放进set函数中实现view层自动更新。

 7.数组的push、shift、concat、unshift、pop等api触发数据更新重新渲染:

  数组没法像对象可以对字段的监听,若想实现监听,必然需要重写push、shift、concat、unshift、pop这些函数

  方案一:

  1. const push1 = Array.prototype.push;
  2. Array.prototype.push = function () {
  3. render(); //拦截进行数组render重新渲染
  4. return push1.apply(this,arguments);
  5. };

  此方案虽然实现数组的监听,但也改变了所有数组的原型,而且不是所有数组都需要监听;

  方案二:

  

  1. 中心思想:代理原型
  1. var obj = Object.create(Array.prototype);
    var prototypePush = Array.prototype.push;
    obj.push=function () {
  1. render(); //拦截进行数组render重新渲染
  1. return prototypePush.apply(this,arguments);
    };
    var arr = [];
    arr.__proto__ = obj;

mvvm的初步思想的更多相关文章

  1. JDBC 常用词汇以及初步思想

    ####JDBC程序访问数据库步骤

  2. 对MVVM思想的在认识

    如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革.它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model ...

  3. 从angularJS看MVVM

    javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到angularJS[ng]这么重量级的 ...

  4. 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

    上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...

  5. 浅谈MVC、MVP、MVVM架构模式的区别和联系

    MVC.MVP.MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用. 一.MVC(Model-View-Controller) MVC是比较直观的架构模式 ...

  6. 完全掌握KMP算法思想

    文档下载页面http://download.csdn.net/detail/yedeqixian/4209500      80页在讲KMP算法的开始先举了个例子,让我们对KMP的基本思想有了最初的认 ...

  7. angularJS看MVVM

    从angularJS看MVVM   javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到a ...

  8. js架构设计模式——从angularJS看MVVM

    javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到 angularJS[ng] 这么重量 ...

  9. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 2)

    MVVM回顾 经过上一篇文章的介绍,相信你对 MVVM的设计思想有所了解.MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在.View只关心怎样渲染,而ViewModel只 ...

随机推荐

  1. CentOS7.6中mysql实践

    cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 使用:yum -y install mysql mysql-server 安装 ...

  2. VM安装后没有桥链接协议解决方法

    从昨天到今天各种折腾的.网络就是各种不通,能使用的手段都上了,还是不行.奇怪的连DNS都ping不通. ping DNS时一致报:  Destination Host Unreachable ... ...

  3. 【编程之美】用C语言实现状态机(实用)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/115105 ...

  4. Go语言标准库之fmt

    fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数. fmt fmt包实现了类似C语言printf和scanf的格式化I/O.主要分为向外输出内容和获取输 ...

  5. 微服务SpringCloud之服务网关zuul一

    前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...

  6. ImageView的功能和使用

    ImageView继承自View类,它的功能用于显示图片, 或者显示Drawable对象 xml属性: src和background区别 参考:http://hi.baidu.com/sunboy_2 ...

  7. 编译gaia

    ./rkst/mkimage.sh rk3066-eng -j8 gaia 分别是编译文件路径 编译的输出类型 处理器分配数 待编译模块 //flash gaia1. adb remount2. ad ...

  8. Android mmap 文件映射到内存介绍

    本文链接: Android mmap 文件映射到内存介绍 Android开发中,我们可能需要记录一些文件.例如记录log文件.如果使用流来写文件,频繁操作文件io可能会引起性能问题. 为了降低写文件的 ...

  9. 01:***VideoToolbox硬编码H.264

    最近接触了一些视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会提供GPU ...

  10. Android进程的优先级说明

    引言 Android系统尽可能长时间地保持应用程序进程,但为了新建或者运行更加重要的进程,总是需要清除一些进程来回收内存.为了决定保留或终止哪个进程,根据进程内运行的组件及这些组件的状态,系统把每个进 ...