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 相关文章推荐
JSON JQUERY模板实现说明
Jul 03 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 Javascript
Node.js操作mysql数据库增删改查
Mar 30 Javascript
NODE.JS跨域问题的完美解决方案
Oct 20 Javascript
vue实现留言板todolist功能
Aug 16 Javascript
p5.js入门教程之键盘交互
Mar 19 Javascript
Vue-cli配置打包文件本地使用的教程图解
Aug 02 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
Aug 22 Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 Javascript
微信小程序scroll-view点击项自动居中效果的实现
Mar 25 Javascript
原生js+canvas实现贪吃蛇效果
Aug 02 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
JavaScript字符串对象
2017/01/14 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
js实现随机点名程序
2020/09/17 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
Python 抓取动态网页内容方案详解
2014/12/25 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
苹果台湾官网:Apple台湾
2019/01/05 全球购物
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
请假条标准格式规范
2014/04/10 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
死亡证明书样本说明
2014/10/18 职场文书
2014年教务工作总结
2014/12/03 职场文书
经理岗位职责
2015/02/02 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js