vue 学习二 深入vue双向绑定原理
vue双向绑定原理 请示总体来讲 就是为data的中的每个属性字段添加一个getter/seter属性 以此来追踪数据的变化,而执行这部操作,依赖的就是js的Object.defineProperty方法Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。
下面就来介绍一下Object.defineproperty()
Object.defineProperty 需要三个参数(object , propName , descriptor)
1 object 对象 => 给谁加
2 propName 属性名 => 要加的属性的名字 【类型:String】
3 descriptor 属性描述 => 加的这个属性有什么样的特性【类型:Object】
它一共有以下六个个特性
- value: 设置属性的值
- writable: 值是否可以重写。true | false
- enumerable: 目标属性是否可以被枚举。true | false
- configurable: 目标属性是否可以被删除或是否可以再次修改特性 true | false
- set: 目标属性设置值的方法
- get:目标属性获取值的方法
首先来介绍第一个 value
let a = {};
Object.defineProperty(a,'name',{
value:"你好"
})
console.log(a);
//打印结果 {name: "你好"}
//如果a中本身拥有一个name属性使用Object.defineproperty去重新定义又会怎样呢
let a = {
name:'初始值'
};
Object.defineProperty(a,'name',{
value:"你好"
})
console.log(a);
//打印结果 {name: "你好"}
这个方法是为 当前的对象添加一个属性 而属性的值为 ‘你好’,如果对象原本便有这个属性那么重写此属性 值得一提的是用这种方法定一的属性时只能读取不能更改的
a.name='我要重新给你赋值';
//以上代码将会报错 Error in created hook: "TypeError: Cannot assign to read only property 'name' of object '#<Object>'"
为什么,其原因就是应为没有定义writable特性
第二个 writable
let a = {};
Object.defineProperty(a,'name',{
value:"你好",
writable:true
})
a.name="我要重新给你赋值";
console.log(a);
//打印结果 {name: "我要重新给你赋值"}
此特性是表明 name属性是否可以写入
第三个enumerable
此属性的表明 被定义的属性是否可以可以被for-in循环或Object.keys()检索到
let a = {};
Object.defineProperty(a, "name", {
writable: true,
enumerable: true,
value:'nihao'
});
console.log(Object.values(a));// 打印值["nihao"]
let a = {};
Object.defineProperty(a, "name", {
writable: true,
enumerable: false,
value:'nihao'
});
console.log(Object.values(a));//打印值[] 定义的属性name没有被检索到
第四个 configurable
此属性表明是否可以再次修改 特性
let a = {
a_attr:"11"
};
Object.defineProperty(a, "name", {
writable: false,//定义特性之后
value: "nihao",
configurable:false //不允许修改特性
});
Object.defineProperty(a, "name", {
value: "nihao",
writable:true //将允许写入特性设置为true
});
a.name="180" //写入值 报错Error in created hook: "TypeError: Cannot redefine property: name"
console.log(a.name)
第五个 get set
这个就是vue双向绑定原理的实现基础了这两个属性表明 属性被写入或者读取是执行方法并且是同步的
let a = {};
Object.defineProperty(a, "name", {
get(){
console.log("我要被读取了")
return '返回的读取的值'
},
set(val){
console.log("我要被写入了 我是写入的值:"+val)
}
});
console.log(a.name); //执行get方法 打印(我要被读取了) 和 (返回读取到的值)
a.name="我要写入你" //执行set方法 打印(我要被写入了 我是写入的值:我要写入你)
vue 学习二 深入vue双向绑定原理的更多相关文章
- day 82 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- day 81 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- Vue中MVVM模式的双向绑定原理 和 代码的实现
今天带大家简单的实现MVVM模式,Object.defineProperty代理(proxy)数据 MVVM的实现方式: 模板编译(Compile) 数据劫持(Observer) Object ...
- vue的双向绑定原理解析(vue项目重构二)
现在的前端框架 如果没有个数据的双向/单向绑定,都不好意思说是一个新的框架,至于为什么需要这个功能,从jq或者原生js开始做项目的前端工作者,应该是深有体会. 以下也是个人对vue的双向绑定原理的一些 ...
- Vue之双向绑定原理动手记
Vue.js的核心功能有两个:一是响应式的数据绑定系统,二是组件系统.本文是通过学习他人的文章,从而理解了双向绑定原理,从而在自己理解的基础上,自己动手实现数据的双向绑定. 目前几种主流的mvc(vm ...
- [Vue源码]一起来学Vue双向绑定原理-数据劫持和发布订阅
有一段时间没有更新技术博文了,因为这段时间埋下头来看Vue源码了.本文我们一起通过学习双向绑定原理来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫 ...
- vue的双向绑定原理及实现
前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图 ...
- Vue双向绑定原理,教你一步一步实现双向绑定
当今前端天下以 Angular.React.vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋. 所以我们要时刻保持好奇心,拥抱变化,只有在不断的变 ...
- vue双向绑定原理分析
当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/jiangzhenf ...
随机推荐
- enovia plm export to sap
UPC creation UPC 结构 PLM 使用的UPC 是 14个数字组成的,兼容. 前两位为 0,后12位为有效数字,在SAP中0会被忽略,符合国际UPC通用 规则, 前一位为0,后13 位为 ...
- ionic3 动态设置tabs页面底部导航栏隐藏,并显示输入框添加评论
1.先上原始效果图: 2.完成后效果 2.实现思路: ion ...
- 2018-12-2-C#-Span-入门
title author date CreateTime categories C# Span 入门 lindexi 2018-12-02 11:32:46 +0800 2018-06-18 11:1 ...
- shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)
一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...
- ListView封装实现下拉刷新和上拉加载(方式2)(转载)
转自:http://blog.csdn.net/jdfkldjlkjdl/article/details/70229465 这次使用的是系统的SwipeRefreshLayout实现下拉刷新,和设置L ...
- string参考
#include <iostream> #include <string.h> class string { private: char *data; public: stri ...
- string::size_type 页73 size_t 页90
异同点: size_t size_type sizeof(XXX)所得到的结果的类型就是 string类类型和vector类类型定义的类型,string的size操作返回来的是string::size ...
- mysql8.*忘记密码
1.关闭mysql服务 2.打开cmd窗口,找到安装目录下的bin然后复制命令 mysqld --console --skip-grant-tables --shared-memory 3.再打开一个 ...
- CTSC2019
(upd:随机立方体AC) 太菜了只会部分分.以后慢慢补坑吧…… 随机立方体: 30分: 正常人都能想到的的转移状态(我的确是弱智),从大往小填数,记录有多少个极大值点和三个方向上各占了多少.转移可以 ...
- noip提高组 2010 关押罪犯 (洛谷1525)
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...