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 相关文章推荐
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
jsTree 基于JQuery的排序节点 Bug
Jul 26 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
Mar 17 Javascript
AngularJS的内置过滤器详解
May 14 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
JavaScript类型相关的常用操作总结
Feb 14 Javascript
js实现时分秒倒计时
Dec 03 Javascript
JS实现音乐钢琴特效
Jan 06 Javascript
JS删除对象中某一属性案例详解
Sep 08 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
VOLVO车载收音机
2021/03/02 无线电
实现“上一页”和“下一页按钮
2006/10/09 PHP
聊天室php&mysql(四)
2006/10/09 PHP
php桌面中心(一) 创建数据库
2007/03/11 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
动物科学专业求职信
2014/07/27 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
党性心得体会
2014/09/03 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
职工食堂管理制度
2015/08/06 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers
python中 Flask Web 表单的使用方法
2022/05/20 Python