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 ...
随机推荐
- JS综合面试题1
function foo(){ getName = function () { alert(1); }; return this; } Foo.getName = function(){ alert( ...
- PHP通过KMP算法实现strpos
起因 昨天看了阮一峰老师的一篇博客<字符串匹配的KMP算法>,讲的非常棒.这篇文章也是解决了: 有一个字符串"BBC ABCDAB ABCDABCDABDE",里面是否 ...
- Numpy_key_point
Numpy使用中的一些注意点: ------------------------------------------------------------------------------------ ...
- PHP-组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- 发布后台接口报错:could not load file or assembly 'mysql.data,' version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d
本地调试正常,但是服务器上面一直报错:could not load file or assembly 'mysql.data,' version=6.7.4.0, Culture=neutral, P ...
- rest framework之限流组件
一.自定义限流 限流组件又叫做频率组件,用于控制客户端可以对API进行的请求频率,比如说1分钟访问3次,如果在1分钟内超过3次就对客户端进行限制. 1.自定义限流 假设现在对一个API访问,在30s内 ...
- vue 学习八 自定义指令
vue指令注册有两种方式 1 全局注册 在main.js中 使用vue.directive Vue.directive('alert_w', { inserted(el,bin,vn) { conso ...
- 从文本文件hello.txt到可执行文件hello
第一阶段 使用编辑器编写的源代码 (.txt) 文件 hello.c.经过 Pre-processor 进行前处理.在前处理阶段,当 pre-processor 读到代码中的#include<s ...
- pc端与移动端适配解决方案之rem
使用方式: 在html页面开头,引入下面的原生js代码 (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'ori ...
- 【leetcode】973. K Closest Points to Origin
题目如下: We have a list of points on the plane. Find the Kclosest points to the origin (0, 0). (Here, ...