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简单表格编辑功能实现方法
Apr 16 Javascript
javascript数字验证的实例代码(推荐)
Aug 20 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
详解vue-cli + webpack 多页面实例应用
Apr 25 Javascript
JS实现图片点击后出现模态框效果
May 03 Javascript
AngularJS基于MVC的复杂操作实例讲解
Dec 31 Javascript
JS从非数组对象转数组的方法小结
Mar 26 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
Dec 03 Javascript
微信小程序提交form操作示例
Dec 30 Javascript
js图片查看器插件用法示例
Jun 22 Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 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抓取页面与代码解析 推荐
2010/07/23 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
python网络编程实例简析
2014/09/26 Python
python中使用mysql数据库详细介绍
2015/03/27 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
后勤岗位职责
2013/11/26 职场文书
商务邀请函范文
2014/01/14 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
全神贯注教学反思
2014/02/03 职场文书
春风行动实施方案
2014/03/28 职场文书
青春寄语大全
2014/04/09 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android