vue数据响应式原理知识点总结


Posted in Javascript onFebruary 16, 2020

vue2.0数据响应式原理

对象

Obect.defineproperty 定义对象的属性mjm

defineproperty 其实不是核心的为一个对象做数据双向绑定,而是去给对象做属性标签,设置一系列操作权限,只不过属性里的get和set实现了响应式

vue数据响应式原理知识点总结

var ob = {
  a: 1,
  b: 2
}
//1-对象 2-属性 3-对于属性的一系列配置
Object.defineProperty(ob, 'a' , { //a对象则是ob的绝对私有属性,,默认都是true
  writable: false,
  enumerable: false,
  configurable: false
})
ob.a = 3
console.log(Object.getOwnPropertyDescriptor(ob, 'a'))
console.log(ob.a) //1
var ob = {
  a: 1,
  b: 2
}

//1-对象 2-属性 3-对于属性的一系列配置
/**
 * vue双向数据绑定
 * 给ob的a属性设置get/set方法,则获取ob的a时,会触发get方法,设置ob的a时,会触发set方法
 */
Object.defineProperty(ob, 'a' , { //a对象则是ob的绝对私有属性,,默认都是true
  get: function(){
    console.log('a- get') 
  },
  set: function(){
    console.log('a- set')

  }
})
ob.a = 3
console.log(ob.a)
//正常用法,,,使用中转,不优雅

var ob = {
  a: 1,
  b: 2
}

//1-对象 2-属性 3-对于属性的一系列配置
/**
 * vue双向数据绑定
 * 给ob的a属性设置get/set方法,则获取ob的a时,会触发get方法,设置ob的a时,会触发set方法
 */
var _value = ob.a //_value 作为一个中转
Object.defineProperty(ob, 'a' , { //a对象则是ob的绝对私有属性,,默认都是true
  get: function(){
    console.log('a- get') 
    return _value;
  },
  set: function(newValue){
    console.log('a- set')
    _value = newValue;
  }
})
ob.a = 3
console.log(ob.a) //get方法必须return ,否则返回undefined

vue数据响应式原理知识点总结

vue数据响应式原理知识点总结

defineProperty 定义的get和set是对象的属性,那么数组怎么办?

做了个装饰者模式

/**
 * 概述  Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。
 *            被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性。
 * 语法  Object.create(proto, [ propertiesObject ])
 */
//数组 -- 做了个装饰者模式
var arraypro = Array.prototype;
var arrob = Object.create(arraypro)
var arr = ['push', 'pop', 'shift']; //枚举这三个,vue中还有其他
arr.forEach((method, index)=>{
  arrob[method] = function(){
    var ret = arraypro[method].apply(this,arguments);
    dep.notify();
  }
})

vue3.0数据响应式原理 - Proxy

Proxy对象用于定义基本操作的自定义行为 ,用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。

和defineProperty类似,功能几乎一样,但是用法不同

为什么要是用Procy?
  1、defineProperty只能监听某个属性,不能对全对象监听
  2、所以可以省去 for in 提升效率
  3、可以监听数组,不用再去单独对数组做特异性操作
改造的observer:

vue.prototype.observer = function(obj){ //注册get/set监听
  var self = this;
  this.$data = new Proxy(this.$data, {
    get: function(target, key, receiver){
      return target[key]
    },
    set: function(target, key, value, receiver){
      // return Reflect.set(target, key, value);
      // return target[key] = value
      target[key] = value;
      self.render();
    }
  })
}

Proxy 用途 -- 校验类型 -- 真正的私有变量

Diff算法和virtua doml

//1-对象 2-属性 3-对于属性的一系列配置

以上就是小编给大家整理的全部相关知识点,感谢大家的学习如果有任何疑问可以联系三水点靠木小编。

Javascript 相关文章推荐
解决jquery .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
Jquery实现无刷新DropDownList联动实现代码
Mar 08 Javascript
js 全兼容可高亮二级缓冲折叠菜单
Jun 04 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
Apr 18 Javascript
jQuery获取checkboxlist的value值的方法
Sep 27 Javascript
Javascript中作用域的详细介绍
Oct 06 Javascript
Vue学习之路之登录注册实例代码
Jul 06 Javascript
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
JavaScript 中的 this 简单规则
Sep 19 Javascript
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
JavaScript undefined及null区别实例解析
Jul 21 Javascript
vue中利用iscroll.js解决pc端滚动问题
Feb 15 #Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
Feb 15 #Javascript
ES6 proxy和reflect的使用方法与应用实例分析
Feb 15 #Javascript
js表达式与运算符简单操作示例
Feb 15 #Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 #Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
Feb 15 #Javascript
es6 super关键字的理解与应用实例分析
Feb 15 #Javascript
You might like
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
JavaScript 指导方针
2007/04/05 Javascript
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
Python优先队列实现方法示例
2017/09/21 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
python关于倒排列的知识点总结
2020/10/13 Python
python中random模块详解
2021/03/01 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
大学新生军训感言
2014/02/25 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
国防教育标语
2014/10/08 职场文书
2014年质检员工作总结
2014/11/18 职场文书
店面出租协议书范本
2014/11/28 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL