Vue双向数据绑定原理-上
Vue响应式的原理(数据改变界面就会改变)是什么?
时时监听数据变化, 一旦数据发生变化就更新界面, 这就是Vue响应式的原理。
Vue是如何实现时时监听数据变化的
通过原生JS的defineProperty方法, 通过get和set方法来监听数据的变化。
defineProperty方法的特点
可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
defineProperty用法
?> 可以直接在一个对象上定义一个新属性
假设我有这么一个需求,给obj对象动态新增一个name属性, 并且name属性的取值必须是BNTang,通过 defineProperty 方法实现。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang'
});
console.log(obj);
</script>
defineProperty 是属于 Object 对象的方法,所以我们可以直接通过 Object.defineProperty 来调用。
- 第一个参数是要定义属性的对象(obj: 需要操作的对象)
- 第二个参数是要定义或修改的属性的名称(prop: 需要操作的属性)
- 第三个参数是将被定义或修改的属性描述符(descriptor: 属性描述符)
最终语法如下:
Object.defineProperty(obj, prop, descriptor)
在上面提出的需求中,我们需要动态新增一个 name 属性,所以第一个参数就是 obj 对象,第二个参数就是 name 属性,第三个参数就是 name 属性的描述符。
我在第三个参数中定义了一个 value 属性,这个 value 属性的值就是 BNTang,这样我们就实现了动态新增一个 name 属性,并且 name 属性的值是 BNTang。
value 属性描述符的作用可以通过value来告诉defineProperty方法新增的属性的取值是什么。
!> 默认情况下通过defineProperty新增的属性的取值是不能修改的。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang'
});
obj.name = 'test';
console.log(obj);
</script>

如果想修改, 那么就必须显示的告诉defineProperty方法,这个属性是可修改的,通过writable属性描述符来实现。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang',
writable: true,
});
obj.name = 'test';
console.log(obj);
</script>

!> 默认情况下通过defineProperty新增的属性是不能删除的。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang',
writable: true,
});
obj.name = 'test';
delete obj.name;
console.log(obj);
</script>

如果想删除, 那么就必须显示的告诉defineProperty方法,这个属性是可删除的,通过configurable属性描述符来实现。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang',
writable: true,
configurable: true,
});
obj.name = 'test';
delete obj.name;
console.log(obj);
</script>

!> 默认情况下通过defineProperty新增的属性是不能遍历(迭代的)。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang'
});
for (let key in obj) {
console.log(key, obj[key]);
}
</script>
如果想迭代, 那么就必须显示的告诉defineProperty方法,这个属性是可迭代的,通过enumerable属性描述符来实现。
<script>
let obj = {};
Object.defineProperty(obj, 'name', {
value: 'BNTang',
enumerable: true
});
for (let key in obj) {
console.log(key, obj[key]);
}
</script>

到此为止,定义一个新属性的方法就介绍完了,接下来我们来看看如何修改一个对象的现有属性。
其实非常的简单,只需要在我们定义对象的时候初始化一个属性,并且给这个属性一个初始值,然后在调用 defineProperty 方法的时候,将这个属性的值修改为我们想要的值就可以了。
代码如下:
<script>
let obj = {name: 'Example'};
Object.defineProperty(obj, 'name', {
value: 'BNTang'
});
console.log(obj);
</script>

Vue双向数据绑定原理-上的更多相关文章
- vue双向数据绑定原理简单实现
vue双向数据绑定原理实现 准备工作 新建一个index.js文件, 一个index.html文件 index.js文件中, 定义Vue类, 并将Vue并称全局变量 window.Vue = ...
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- Vue双向数据绑定原理分析(转)
add by zhj: 目前组里使用的是前端技术是jQuery + Bootstrap,后端使用的Django,Flask等,模板是在后端渲染的.前后端没有分离,这种做法有几个缺点 1. 模板一般是由 ...
- Vue双向数据绑定原理深度解析
首先,什么是双向数据绑定?Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 在分析其原理和代码的时候,大家首先了解如下几个j ...
- 手写MVVM框架 之vue双向数据绑定原理剖析
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Vue双向数据绑定原理解析
基本原理 Vue.采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调 ...
- vue 双向数据绑定原理
博客地址: https://ainyi.com/8 采用defineProperty的两个方法get.set 示例 <!-- 表单 --> <input type="tex ...
- Vue 双向数据绑定原理分析 以及 Object.defineproperty语法
第三方精简版实现 https://github.com/luobotang/simply-vue Object.defineProperty 学习,打开控制台分别输入以下内容调试结果 userInfo ...
- Vue双向数据绑定原理
https://www.cnblogs.com/kidney/p/6052935.html?utm_source=gold_browser_extension
- 详解 vue 双向数据绑定的原理,并实现一组双向数据绑定
1:vue 双向数据绑定的原理: Object.defineProperty是ES5新增的一个API,其作用是给对象的属性增加更多的控制Object.defineProperty(obj, prop, ...
随机推荐
- 怎么用 Solon 开发基于 undertow jsp tld 的项目?(新)
Solon 开发 jsp 项目是非常简单的,只要改用 jetty 启动器 或者 undertow 启动器,其它也没特别之处了.此文用 undertow + jsp + tld 这个套路搞一把: 一. ...
- Excel 查找替换 -- 快速填充
单元格匹配,这样就不会把 70 的 0 替换成 7零 了 Ctrl + E 快速填充 一列变多行 快速填充 1. 快速拆分数据 一列数据中包含了姓名和手机号码,这时你需要进行数据拆分,快速填充可以实现 ...
- 记录一次Java内存泄露分析过程
版权说明: 本文章版权归本人及博客园共同所有,转载请在文章前标明原文出处( https://www.cnblogs.com/mikevictor07/p/13032635.html ),以下内容为个人 ...
- KB21N、KB24N作业分配与冲销
一.KB21N 调用BAPI:BAPI_ACC_ACTIVITY_ALLOC_POST 经测试,分配订单时行项目一次性最多传332条数据 "------------------------- ...
- 自用 IntelliJ IDEA Vim 插件配置
Prefrence: https://einverne.github.io/post/2020/12/my-idea-vimrc-config.html https://gist.github.com ...
- 【C++开源库】Windows 下编译 libcurl 库
亲测可用: https://codeantenna.com/a/pJaN3omqjp What is libcurl ? libcurl 是一个跨平台的网络协议库,支持 http, https, ft ...
- #2051:Bitset(进制转化)
Problem Description Give you a number on base ten,you should output it on base two.(0 < n < 10 ...
- 如何使用chatgpt编写代码
功能列举 回答编程问题 我想让你充当 Stackoverflow 的帖子.我将提出与编程有关的问题,你将回答答案是什么.我希望你只回答给定的答案,在没有足够的细节时写出解释.当我需要用英语告诉你一些事 ...
- 【C++】枚举作为类函数返回值时需定义在使用之前
枚举定义在前,作为函数返回值在后 枚举定义在后,则函数返回值需用普通类型
- NewStarCTF 2023 公开赛道 WEEK4|CRYPTO WP
RSA Variation II 1.题目信息 提示:"Schmidt Samoa" 附件信息 from secret import flag from Crypto.Util.n ...