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.mzph.cn/news/584723.shtml

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

相关文章

【机器学习前置知识】Beta分布

Beta分布与二项分布的关系 Beta分布与二项分布密切相关,由二项分布扩展而来,它是用来描述一个连续型随机变量出现的概率的概率密度分布,表示为 X X X~ B e t a ( a , b ) Beta(a,b) Beta(a,b) , a 、 b a、b a、b 是形状参数。Beta分布本质上也是一个概率密度函数,只是这…

nodeJS搭建免费代理IP池爬取贴吧图片实战

之前用python写过爬虫&#xff0c;这次想试试nodeJS爬虫爬取贴吧图片&#xff0c;话不多说代码如下&#xff0c;爬取制定吧的前十页所有帖子里的图片 爬取贴吧图片脚本 你得提前创建一个images文件夹 const axios require("axios"); const cheerio require("…

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

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

[Angular] 笔记 19:路由参数

油管视频 Route Parameters 路由参数是跟在 url 后面的数字&#xff0c;字符串&#xff0c;或者 数字字符串&#xff0c;例如如下 url 中的 123&#xff0c;此类参数会传给后端&#xff1a; www.facebook.com/profile/123 首先将 pokemon-template-form 组件移到 pokeman-ba…

骑砍战团MOD开发(27)-module_tableau_materials.py材质

一.配置材质资源 OpenBrf寻找对应材质资源. tableau配置材质资源 ("round_shield_1", 0, "sample_shield_round_1", 512, 256, 0, 0, 0, 0,[(store_script_param, ":banner_mesh", 1),(set_fixed_point_multiplier, 100),(init_position, pos1),…

golang第六卷---go命令

go命令 go/go helpgo versiongo envgo buggo buildgo installgo getgo modgo rungo cleango docgo fixgo fmtgo generatego workgo testgo toolgo vet go/go help 通过该命令&#xff0c;我们可以查看go语言中的所有命令&#xff0c;其中go与go help两个命令是等效的 如下&…

攻防技术-单包攻击防范:扫描、畸形、特殊(HCIP)

单包攻击类型介绍 一、扫描窥探攻击 1、地址扫描攻击防范 攻击介绍 运用ping程序探测目标地址&#xff0c;确定目标系统是否存活。也可使用TCP/UDP报文对目标系统发起探测&#xff08;如TCP ping&#xff09;。 防御方法 检测进入防火墙的ICMP、TCP和UDP报文&#xff0c;根…

集群部署篇--Redis 主从模式

文章目录 前言Redis 主从部署&#xff1a;1.1 主从架构 介绍&#xff1a;1.2 主从架构 实现&#xff1a;1.2.1 redis 安装&#xff1a; 1.3 主从架构优缺点&#xff1a;1.4 故障转移&#xff1a; 总结 前言 显然在线上环境中 Redis 服务不能以单机的方式运行&#xff0c;必须有…

k8s的陈述式资源管理

k8s的陈述式资源管理&#xff1a; 命令行&#xff1a;kubectl命令行工具 优点&#xff1a;90%以上的场景都可以满足 对资源的增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好 缺点&#xff1a; 命令比较冗长&#xff0c;复杂&#xff0c;难记 声明式&…

MYSQL二主二从集群部署

目录 一、环境描述 二、安装mysql 2.1 卸载mysql(如果没安装过&#xff0c;可忽略) 2.1.1 列出安装的mysql 2.1.2 卸载mysql 2.1.3 删除mysql文件目录 2.1.3.1 查看mysql 目录 2.1.3.2 依次删除 2.2 在线安装 2.2.1 下载安装源 2.2.2 安装源rpm 2.2.3 加入rpm密钥 …

封装uniapp签字板

新开发的业务涉及到签字功能&#xff0c;由于是动态的表单&#xff0c;无法确定它会出现在哪里&#xff0c;不得已封装模块。 其中涉及到一个难点就是this的指向性问题&#xff0c; 第二个是微信小程序写法&#xff0c; 我这个写法里用了u-view的写法&#xff0c;可以自己修改组…

证明:切线垂直于半径

证明&#xff1a; 切线垂直于过切点的半径。 下面是网上最简单的证明方法。 证明&#xff1a; 利用反证法。 如下图所示&#xff0c;直线AB和圆O切于点A&#xff0c;假设OA 不垂直于 AB&#xff0c;而 O B ⊥ A B OB \perp AB OB⊥AB&#xff0c;则 ∠ O B A 90 \angle OB…

【自然语言处理】类似GPT的模型

除了GPT (Generative Pre-trained Transformer) 之外&#xff0c;还有一些其他的好用的类似工具可以用来生成文本。以下是几个受欢迎的工具&#xff1a; BERT (Bidirectional Encoder Representations from Transformers): BERT 是一个预训练的深度双向 Transformer 模型&#…

7天玩转 Golang 标准库之 os

在 Golang 的日常开发中&#xff0c;往往要面对各种和操作系统相关的操作&#xff0c;例如文件的读写、环境变量的处理、程序参数的获取等等。Golang 的 os 标准库为我们提供了与操作系统打交道的各类工具&#xff0c;能让这些操作变得更加简洁和简单。 基础应用 文件的读写操…

第八周:AIPM面试准备

以下为从开始准备转行到拿到offer期间每天需要准备的10个面试题目以及相关知识补充&#xff01;来源广泛&#xff0c;从各个地方收集&#xff0c;只提供题目&#xff0c;我自己的尝试回答也会陆续放在我的喜马拉雅&#xff0c;基于我粗浅的认知&#xff0c;分享我粗浅的作答思路…

------- 计算机网络基础

1.1概述 是什么? 答出独立计算机通信线路连接实现资源共享 计算机网络组成 从组成部分看: 硬件软件协议 从工作方式看: 边缘部分和核心部分 从功能组成看: 通信子网和资源子网 计算机网络性能指标 速率是指数据传输的物理速度&#xff0c;吞吐量是指实际的数据传输…

k8s的陈述式资源管理(命令行操作)

&#xff08;一&#xff09;k8s的陈述式资源管理 1、命令行&#xff1a;kubectl命令行工具——用于一般的资源管理 &#xff08;1&#xff09;优点&#xff1a;90%以上ce场景都可以满足 &#xff08;2&#xff09;特点&#xff1a;对资源的增、删、查比较方便&#xff0c;对…

如何使用idea部署springboot项目全过程

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

如果SSE推送不稳定,是不是可以考虑切换成WebSocket,各自有什么优缺点

面对 Server-Sent Events (SSE) 推送不稳定的情况时&#xff0c;可以考虑切换到 WebSocket。SSE 和 WebSocket 都是现代Web应用中用于实现实时通信的技术&#xff0c;但它们有各自的优缺点和最适用的场景。 Server-Sent Events (SSE) 优点 简单性&#xff1a;SSE 在使用上比…

Adobe 设计精髓:创新的用户体验 | 开源日报 No.130

adobe/react-spectrum Stars: 10.1k License: Apache-2.0 React Spectrum Libraries 是一系列的库和工具&#xff0c;旨在帮助开发者构建适应性强、可访问性好且稳健的用户体验。 核心优势&#xff1a; 提供全面的可访问性和行为支持&#xff0c;符合 WAI-ARIA 编写实践&…