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类的定义
Jun 28 Javascript
基于jQuery的公告无限循环滚动实现代码
May 11 Javascript
jQuery源码中的chunker 正则过滤符分析
Jul 31 Javascript
学习javascript面向对象 理解javascript对象
Jan 04 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
May 25 Javascript
html+js实现简单的计算器代码(加减乘除)
Jul 12 Javascript
jQuery组件easyui基本布局实现代码
Aug 25 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
分享5个好用的javascript文件上传插件
Sep 16 Javascript
详解Puppeteer前端自动化测试实践
Feb 21 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 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预定义常量
2006/12/25 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
微信小程序签到功能
2018/10/31 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Python书单 不将就
2017/07/11 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
flask框架路由常用定义方式总结
2019/07/23 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
毕业生如何写自荐信
2014/03/26 职场文书
讲文明倡议书
2015/04/29 职场文书
甲午大海战观后感
2015/06/02 职场文书
高中班主任心得体会
2016/01/07 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
浅析MongoDB之安全认证
2021/06/26 MongoDB
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers