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 相关文章推荐
js的Boolean对象初始值示例
Mar 04 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
Oct 31 Javascript
jQuery遍历DOM节点操作之filter()方法详解
Apr 14 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
Feb 14 Javascript
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
AngularJS 中的数据源的循环输出
Oct 12 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
Oct 24 Javascript
vue组件编写之todolist组件实例详解
Jan 22 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 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
生成php程序的php代码
2008/04/07 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
分享10段PHP常用代码
2015/11/11 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
js实现圆盘记速表
2015/08/03 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
vue之数据交互实例代码
2017/06/16 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
使用Python实现一个简单的项目监控
2015/03/31 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
python 爬取小说并下载的示例
2020/12/07 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
农业资源与环境专业自荐信范文
2013/12/30 职场文书
网吧消防安全制度
2014/01/28 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
公民授权委托书
2014/10/15 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
使用python创建股票的时间序列可视化分析
2022/03/03 Python
Elasticsearch 批量操作
2022/04/19 Python