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 相关文章推荐
CSDN轮换广告图片轮换效果
Mar 27 Javascript
js indexOf()定义和用法
Oct 21 Javascript
Javascript倒计时页面跳转实例小结
Sep 11 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
JQuery中serialize()用法实例分析
Feb 06 Javascript
Javascript缓存API
Jun 14 Javascript
jQuery表单验证之密码确认
May 22 jQuery
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
使用Node.js实现base64和png文件相互转换的方法
Mar 11 Javascript
JavaScript实现tab栏切换效果
Mar 16 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php中 $$str 中 "$$" 的详解
2015/07/06 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
JS支持带x身份证号码验证函数
2008/08/10 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
vue实现学生信息管理系统
2020/05/30 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
python获得一个月有多少天的方法
2015/06/04 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
python如何实现内容写在图片上
2018/03/23 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python 的AES加密与解密实现
2019/07/09 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
教师专业自荐书范文
2014/02/10 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
化工见习报告范文
2014/10/31 职场文书
2015年服务员工作总结
2015/04/08 职场文书
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android