(尚049)Vue_源码分析_数据代理_效果+(尚050)Vue_源码分析_数据代理_效果_debug

数据代理:

1) 数据代理:通过一个对象代理另一个对象(在前一个对象内部)中属性的操作(读/写)

如:a中包含[b, , , , ] (a代理b)

a.b.xxx

代理:  a.xxx  (编码的时候操作的是a,本质是操作的a中的b)

2) vue数据代理:通过vm对象来代理data对象中所有属性的操作

3) 好处:更方便的操作data中的数据

4)基本实现流程

  a.通过Object.defineProperty()给vm添加与data对象的属性对应的属性描述符

  b.所有添加的属性都包含getter和setter

  c.getter/setter内部去操作data中对应的属性数据

==================================================================

const vm=new Vue({  el:‘#test‘,  data:{    name:‘赵云‘  }})console.log(vm.name,vm)  //赵云

======================================================================

02_数据代理_vue.html

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>02_数据代理_vue</title></head><body><div id="test"></div><script type="text/javascript" src="./js/vue.js"></script><script type="text/javascript">  const vm=new Vue({    el:‘#test‘,    data:{      name:‘赵云‘    }  })  console.log(vm.name,vm)  //赵云  //vm代理对data数据的读操作  vm.name=‘关羽‘   //现在编码的时候改变的是vm中的name,但是vm不存name值,数据在data中   //vm代理对data数据的写操作  //如何验证数据在data中?  console.log(vm._data.name,vm.name)  //关羽

</script></body></html>====================================================================================================================

===============================================================================

02_数据代理_mvvm.html

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>02_数据代理</title></head><body>

<!--1. vue数据代理: data对象的所有属性的操作(读/写)由vm对象来代理操作2. 好处: 通过vm对象就可以方便的操作data中的数据3. 实现:  1). 通过Object.defineProperty(vm, key, {})给vm添加与data对象的属性对应的属性  2). 所有添加的属性都包含get/set方法  3). 在get/set方法中去操作data中对应的属性--><div id="test"></div><script type="text/javascript" src="js/mvvm/compile.js"></script><script type="text/javascript" src="js/mvvm/mvvm.js"></script><script type="text/javascript" src="js/mvvm/observer.js"></script><script type="text/javascript" src="js/mvvm/watcher.js"></script><script type="text/javascript" src="./js/vue.js"></script><script type="text/javascript">  const vm=new MVVM({    el:‘#test‘,    data:{      name:‘赵云2‘    }  })  console.log(vm.name,vm)  //赵云  //vm代理对data数据的读操作  vm.name=‘关羽2‘   //现在编码的时候改变的是vm中的name,但是vm不存name值,数据在data中   //vm代理对data数据的写操作  //如何验证数据在data中?  console.log(vm._data.name,vm.name)  //关羽

</script></body></html>====================================================================================================================Mvvm.js
/*相关于Vue的构造函数 */function MVVM(options) {  // 将选项对象保存到vm  this.$options = options;  // 将data对象保存到vm和datq变量中  var data = this._data = this.$options.data;  //将vm保存在me变量中  var me = this;  // 遍历data中所有属性  Object.keys(data).forEach(function (key) { // 属性名: name    // 对指定属性实现代理    me._proxy(key);  });

  // 对data进行监视  observe(data, this);

  // 创建一个用来编译模板的compile对象  this.$compile = new Compile(options.el || document.body, this)}

MVVM.prototype = {  $watch: function (key, cb, options) {    new Watcher(this, key, cb);  },

  // 对指定属性实现代理  _proxy: function (key) {    // 保存vm    var me = this;    // 给vm添加指定属性名的属性(使用属性描述)    Object.defineProperty(me, key, {      configurable: false, // 不能再重新定义      enumerable: true, // 可以枚举      // 当通过vm.name读取属性值时自动调用      get: function proxyGetter() {        // 读取data中对应属性值返回(实现代理读操作)        return me._data[key];      },      // 当通过vm.name = ‘xxx‘时自动调用      set: function proxySetter(newVal) {        // 将最新的值保存到data中对应的属性上(实现代理写操作)        me._data[key] = newVal;      }    });  }};============================================================================

============================================================================debug调试别人的代码1).打断点:打到哪个位置?打几个断点?什么时候打断点?

(1).:尽量把当前断点管理的区域执行完.(假如只有一个断点,代码会全部执行完毕;中间碰到其他断点会暂停)

(2).:执行完当前的语句,也就是单步执行.

例如:执行完下面图片上这条语句

(3).:进入函数执行.

:箭头代表当前运行到了mvvm函数

(4).:出去:相当于把函数体执行完毕



原文地址:https://www.cnblogs.com/curedfisher/p/12297907.html

时间: 2024-10-22 03:35:14

(尚049)Vue_源码分析_数据代理_效果+(尚050)Vue_源码分析_数据代理_效果_debug的相关文章

PHP批量替换MySql数据库中的数据内容(替换MySql数据库内容源码)

PHP批量替换MySql数据库内容 UTF-8 1.0版 <?php //声明 //1.本源码开发意图:作者在使用一些CMS建站的时候发现很多CMS把网址写入到数据库了,如果换网址,那么就需要更新数据库中的老网址,如果一个一个修改,很不方便,所以开发此源码,供大家学习或使用: //2.源码开发者:杨波: //3.源码开发者联系QQ:773003231: //4.源码开发者博客:http://www.cnblogs.com/phpyangbo/: //5.源码开放性:任何人都可以随意更改或使用本源

JDK动态代理[2]----JDK动态代理的底层实现之Proxy源码分析

在上一篇里为大家简单介绍了什么是代理模式?为什么要使用代理模式?并用例子演示了一下静态代理和动态代理的实现,分析了静态代理和动态代理各自的优缺点.在这一篇中笔者打算深入源码为大家剖析JDK动态代理实现的机制,建议读者阅读本篇前可先阅读一下笔者上一篇关于代理模式的介绍<JDK动态代理[1]----代理模式实现方式的概要介绍> 上一篇动态代理的测试类中使用了Proxy类的静态方法newProxyInstance方法去生成一个代理类,这个静态方法接收三个参数,分别是目标类的类加载器,目标类实现的接口

第87课:Flume推送数据到SparkStreaming案例实战和内幕源码解密

本期内容: 1. Flume on HDFS案例回顾 2. Flume推送数据到Spark Streaming实战 3. 原理绘图剖析 1. Flume on HDFS案例回顾 上节课要求大家自己安装配置Flume,并且测试数据的传输.我昨天是要求传送的HDFS上. 文件配置: ~/.bashrc: export FLUME_HOME=/usr/local/flume/apache-flume-1.6.0-bin export FLUME_CONF_DIR=$FLUME_HOME/conf PA

第87讲:Flume推送数据到SparkStreaming案例实战和内幕源码解密

本期内容: 1. Flume on HDFS案例回顾 2. Flume推送数据到Spark Streaming实战 3. 原理绘图剖析 1. Flume on HDFS案例回顾 上节课要求大家自己安装配置Flume,并且测试数据的传输.我昨天是要求传送的HDFS上. 文件配置: ~/.bashrc: export FLUME_HOME=/usr/local/flume/apache-flume-1.6.0-bin export FLUME_CONF_DIR=$FLUME_HOME/conf PA

Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没仔细的梳理源码的入门逻辑,今天也就来讲一个源码的玩法,各位看官,一起学习学习! 看本篇博客之前,先看下我的前面两篇 Android源码浅析(一)--VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置 Android源码浅析(二)--Ubuntu Roo

阅读源码需要注意什么问题,有什么好的源码下载网站

程序员除了养成看官方文档的阅读习惯外还需要有自己的学习全和交流平台,推荐几个源码下载网站,可以去上面学习下,做好的源码很适合新手更快的学习.阅读别人的代码.作为开发人员是一件经常要做的事情.一个是学习新的编程语言的时候通过阅读别人的代码是一个最好的学习方法,另外是积累编程经验.本文上半部分主要是之前在网上看到的,拿到这里跟大家分享下. 收集所有可能收集的材料 阅读代码要做的第一件事情是收集所有和项目相关的资料.比如你要做一个项目的售后服务,那么你首先要搞明白项目做什么用的,那么调研文档.概要设计

【nodejs原理&amp;源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

目录 一. 概述 二. 线程与进程 三. cluster模块源码解析 3.1 起步 3.2 入口 3.3 主进程模块master.js 3.4 子进程模块child.js 四. 小结 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 一. 概述 cluster模块是node.js中用于实现和管理多进程的模块.常规的node.js应用程序是单线程单进程的,这也意味

opencvbase 实现opencv打开摄像头和初步处理等效果操作(附源码)

// TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat matheader; CvMat * mat = cvGetMat(img, &matheader); CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3); cvConvert(img, mat) IplImage -> Mat

Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展,并重新打包文件,替换原有的 jar 文件,满足测试开发自身的需求. 下面以修改 eclipse 默认注释中的 ${date} 和 ${time} 对应的返回样式(如下图所示),进行实例说明. 整个二次开发的过程如下所示: 0.未修改之前,生成注释的日期.时间显示格式如下所示: 1.获取对应的 jar

C# winform 实现微信二维码登录、第三方登录(已实现、附源码)

原文:C# winform 实现微信二维码登录.第三方登录(已实现.附源码) 前言 应上级要求,在项目登录的时候实现第三方登录.很荣幸我接到了这个任务,但是我之前完全都没接触到.开发周期是三天,对于我们这种小白完全是从零开始.最后成功的实现这个功能固然重要,但是这个探索的过程才值得回味.光需要代码可以直接下载源码,我们重要说下实现过程和步骤,自己也巩固和记录一下! 实现步骤 1. 我实现的是微信扫码登录,当然要知道微信给的接口,可以在https://open.weixin.qq.com/ 这里申