javascript实现数据双向绑定

ES5中的双向绑定

ES5中的对象属性类型有两种:分别是数据属性访问器属性

一,数据属性

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性

1,configurable:表示能否通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性;如果设置为true表示可以删除,如果是false不能被删除,默认为false

    //为false的情况下无法删除const obj={name:"张三"}Object.defineProperty(obj,'name',{configurable:false})delete obj.nameconsole.log(obj.name)//张三//为true的情况下可以删除const obj={name:"张三"}Object.defineProperty(obj,'name',{configurable:true})delete obj.nameconsole.log(obj.name)//undefined

2,Enumerable:表示能否通过for-in循环返回属性;设置为true可以被枚举,设置为false,不能被枚举,默认为false

    //为false无法被枚举const obj={name:"张三",}Object.defineProperty(obj,'name',{enumerable:false})for(let key in obj){console.log(obj[key]) //无任何输出}//为true可以被枚举const obj={name:"张三",}Object.defineProperty(obj,'name',{enumerable:false})for(let key in obj){console.log(obj[key])//张三}

3,Writable:表示能否修改这个属性的值;设置为true可以被重写,设置为false,不能被重写,默认为false

    //默认不能重写const obj={}Object.defineProperty(obj,'name',{value:'张三'})console.log(obj.name)//张三obj.name='李四'console.log(obj.name)//张三//设置为true可以重写const obj={}Object.defineProperty(obj,'name',{value:'张三',writable:true})console.log(obj.name)//张三obj.name='李四'console.log(obj.name)//李四

4,value:包含这个属性的值;

    const obj={name:'张三'}Object.defineProperty(obj,'name',{value:'李四'})//改变obj.name的值为李四,输出来李四console.log(obj.name)//李四//如果没有设置值,还是返回原来的值const obj={name:'张三'}Object.defineProperty(obj,'name',{})console.log(obj.name)//张三

要修改属性的默认特性,必须使用ES5中的Object.defineProperty()方法,这个方法接收三个参数,属性所在的对象,属性的名字和一个描述符对象,描述符对象的属性就是上面的4个

二,访问器属性

访问器属性不包含数据值,它们是一对getter和setter函数,在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值。这个函数负责如何处理数据。访问器属性有4个特性 configurable和Enumerable(这两个属性和上面的用法相同)

1,Get:在读取属性时调用函数:默认为undefined

2,Set:在写入属性时调用函数:默认为undefined

注意:使用访问器属性中 getter或 setter方法,不能使用 writable 和 value 这两个配置项

    const obj={}let age=20Object.defineProperty(obj,'age',{get:function () {console.log("读取属性值的时候调用")return age},set:function (newValue) {console.log("写入属性值的时候调用")age=newValue}})console.log(obj.age)//20//设置了属性值会调用set方法obj.age=30console.log(obj.age)//30

实现一个小案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input type="text" id="demo">
<div id="test">test</div>
</body>
<script>const obj={}//用于设置obj的属性值为nameObject.defineProperty(obj,'name',{//获取到设置set的值//读取到obj.name属性值的更改set:function(value){document.getElementById('test').innerHTML=value}})console.log(obj.name)//获取到文本框中的值并赋给obj.namedocument.getElementById('demo').oninput=function (e) {obj.name=e.target.value}
</script>
</html>

三,定义多个属性

Object.defineProperties()方法一次设置或修改多个属性。这个方法接受两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

    const obj4={_name:"王五",_age:33}Object.defineProperties(obj4,{age:{get(){console.log("监听到读取age属性")return this._age},set(value){console.log("监听到设置age属性")this._age=valuereturn this._age}},name:{get(){console.log("读取到name属性")return this._name},set(value){console.log("监听到正在设置name属性")this._name=valuereturn this._name}}})console.log(obj4.age,obj4.name)//33 王五obj4.age=34obj4.name="哈哈"console.log(obj4.age,obj4.name)//34 '哈哈'

四,读取属性的特性

es5中Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符,这个方法接受两个参数;属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性性有configurable,enumerable,get,set;如果是数据属性,这个对象的属性有configurable,enumerable,writable,value

    const obj2={name:30}const descriptor=Object.getOwnPropertyDescriptor(obj2,'name')console.log(descriptor)//是一个对象,包含如下特性

ES6中的双向绑定

未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307716.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构入门到入土——ArrayList与顺序表

目录 一&#xff0c;线性表 二&#xff0c;顺序表 1.接口实现 三&#xff0c;ArrayList简介 四&#xff0c;ArrayList使用 1.ArrayList的构造 2.ArrayList常见操作 3.ArrayList的遍历 4.ArrayList的扩容机制 五&#xff0c;ArrayLisit的具体使用 杨辉三角 一&#x…

Thinkphp+vue+mysql学生作业管理系统21j0r

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 为设计一个安全便捷&#xff0c;并且使用户更好获取本学院…

余弦相似度算法

余弦相似度算法 是什么 余弦距离&#xff0c;也称为余弦相似度&#xff0c;是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似&#xff0c;这就叫"余弦相似性&q…

pd工具箱 Parallels Toolbox

Parallels Toolbox是一款适用于Mac和PC的强大工具箱软件&#xff0c;集成了多种实用的工具和功能&#xff0c;旨在帮助用户提高工作效率和生产力。它提供了文件管理、截图、音频视频处理、清理工具等众多工具&#xff0c;使用户能够方便快捷地完成各种常见任务。Parallels Tool…

C++力扣题目150--逆波兰表达式求值

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

哪些关键供应链指标的数据集成可以提高智能商品系统决策支持效果

在提高智能商品系统供应链决策支持效果方面&#xff0c;以下是一些关键供应链指标的数据集成对于效果最为重要的指标&#xff1a; 销售数据&#xff1a;销售数据是评估产品需求和市场趋势的重要指标。通过集成销售数据到智能商品系统中&#xff0c;可以实时监测产品销售情况&a…

Leetcode的AC指南 —— 哈希法/双指针:15. 三数之和

摘要&#xff1a; Leetcode的AC指南 —— 15. 三数之和。题目介绍&#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且…

数据加密、端口管控、行为审计、终端安全、整体方案解决提供商

PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于这几个概念的解释&#xff1a; 数据加密&#xff1a;这是一种通过加密算法和密钥将明文转换为密文&#xff0c;以及通过解密算法和解密密钥将密文恢复为明文…

《新传奇》期刊投稿论文发表

《新传奇》杂志是经国家新闻出版总署批准、面向国内外公开发行的综合性社科期刊&#xff0c;由湖北省文联主管&#xff0c;湖北今古传奇传媒集团有限公司主办&#xff0c;湖北优秀期刊。本刊旨在坚守初心、引领创新&#xff0c;展示高水平研究成果&#xff0c;支持优秀学术人才…

Python+Yolov5+Qt交通标志特征识别窗体界面相片视频摄像头

程序示例精选 PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头》编写代码&a…

vue 拖拽通过子元素拖拽父元素指令

vue 拖拽通过子元素拖拽父元素指令 需求 拖拽头部 拖动整个框 // candrag.js中的代码如下 directive // 通过子元素 控制移动父元素&#xff0c; 如果 需要直接控制父元素可以再写一个自定义指令 或者改造下这个指令 export default {// 定义 Vue 插件install(Vue) {Vue.di…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# HeapingVS Stacking第二节 栈基本工作原理 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.cs…