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 相关文章推荐
JavaScript 题型问答有答案参考
Feb 17 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 Javascript
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
jquery form 加载数据示例
Apr 21 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
Mar 03 Javascript
JavaScript中定义函数的三种方法
Mar 12 Javascript
jQuery实现的仿select功能代码
Aug 19 Javascript
JavaScript数组方法总结分析
May 06 Javascript
微信小程序三级联动选择器使用方法
May 19 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 Javascript
Vue实现验证码功能
Dec 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提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php 保留字列表
2012/10/04 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
jquery JSON的解析方式
2009/07/25 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python统计文章中单词出现次数实例
2020/02/27 Python
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
大专生的学习自我评价
2013/12/04 职场文书
宿舍违规检讨书
2014/01/12 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
质量保证书格式
2015/02/27 职场文书
清洁工个人总结
2015/03/04 职场文书
任命通知范文
2015/04/21 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL