javascript实现数据双向绑定

ES5中的双向绑定

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

一,数据属性

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

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

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

    //为true的情况下可以删除
    const obj={
        name:"张三"
    }
    Object.defineProperty(obj,'name',{
        configurable:true
    })
    delete obj.name
    console.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=20
    Object.defineProperty(obj,'age',{
        get:function () {
            console.log("读取属性值的时候调用")
            return age
        },
        set:function (newValue) {
            console.log("写入属性值的时候调用")
            age=newValue
        }
    })
    console.log(obj.age)//20
    //设置了属性值会调用set方法
    obj.age=30
    console.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的属性值为name
    Object.defineProperty(obj,'name',{
        //获取到设置set的值
        //读取到obj.name属性值的更改
        set:function(value){
            document.getElementById('test').innerHTML=value
        }
    })
    console.log(obj.name)
    //获取到文本框中的值并赋给obj.name
    document.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=value
                return this._age
            }
        },
        name:{
            get(){
                console.log("读取到name属性")
                return this._name
            },
            set(value){
                console.log("监听到正在设置name属性")
                this._name=value
                return this._name
            }
        }
    })
    console.log(obj4.age,obj4.name)//33 王五
    obj4.age=34
    obj4.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.mfbz.cn/a/278280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring基础IoC(控制反转)与DI(依赖注入)

1. Spring 基础 1.1 什么是Spring框架&#xff1f;它能带来那些好处&#xff1f; Spring 是一个开源的轻量级的 Java 开发框架&#xff0c;可以帮助开发人员更高效的进行开发&#xff0c;主要优势在于简化开发和框架整合。 Spring框架整合了很多模块&#xff0c;这些模块可以…

【ArkTS入门】ArkTS开发初探:语言特点和开发特点

什么是ArkTS&#xff1f; ArkTS是一个为鸿蒙组件而生的框架&#xff0c;语法亲人好用。基于TypeScript&#xff0c;ArkTS拓展了声明式UI、状态管理等的能力&#xff0c;从本质上来讲&#xff0c;是TypeScript的扩展&#xff0c;主要服务于前端。 ArkTS的开发可以满足“一次开…

【北亚服务器数据恢复】san环境下LUN Mapping出错导致文件系统一致性出错的数据恢复案例

服务器数据恢复环境&#xff1a; san环境下的存储上一组由6块硬盘组建的RAID6&#xff0c;划分为若干LUN&#xff0c;MAP到跑不同业务的服务器上&#xff0c;服务器上层是SOLARIS操作系统UFS文件系统。 服务器故障&#xff1a; 业务需求需要增加一台服务器跑新增的应用&#xf…

OR-NeRF论文笔记

OR-NeRF论文笔记 文章目录 OR-NeRF论文笔记论文概述Abstract1 Introduction2 Related Work3 Background4 Method4.1 Multiview Segmentation4.2 Scene Object Removal 5 ExperimentsDatasetsMetricsMultiview SegmentationScene Object Removal 6 Conclusion 论文概述 目的&am…

VMware Workstation Pro 16 安装 Ubuntu系统(带磁盘简单分区选择)

选择新建虚拟机选择典型&#xff08;推荐&#xff09;安装 选择稍后安装操作系统 选择Linux操作系统 版本选择Ubuntu 本地磁盘最少有10G空间&#xff0c;当然空间大一点更好。最好路径不带中文&#xff0c;新建文件夹&#xff0c;单独存放虚拟机&#xff0c;方便删除和更新。…

【Spark精讲】一文讲透SparkSQL执行过程

SparkSQL执行过程 逻辑计划 逻辑计划阶段会将用户所写的 SQL语句转换成树型数据结构(逻辑算子树)&#xff0c; SQL语句中蕴含的逻辑映射到逻辑算子树的不同节点。 顾名思义&#xff0c;逻辑计划阶段生成的逻辑算子树并不会直接提交执行&#xff0c;仅作为中间阶段 。 最终逻辑…

基于优化的规划方法 - 数值优化基础 Frenet和笛卡尔的转换 问题建模 实现基于QP的路径优化算法

本文讲解基于优化的规划算法&#xff0c;将从以下几个维度讲解&#xff1a;数值优化基础、Frenet与Cartesian的相互转换、问题建模OSQP 1 数值优化基础 1.1 优化的概念 一般优化问题公式&#xff1a; f ( x ) f(x) f(x)&#xff1a;目标/成本函数 x x x&#xff1a;决策变…

如何把握品牌新五感,打造小红书品牌

随着社会经济的发展&#xff0c;市场的进步&#xff0c;以及人们思维方式的改变。年轻人面对市场&#xff0c;面对营销&#xff0c;关注点也在发生着改变。那什么是小红书品牌新五感&#xff0c;如何把握品牌新五感&#xff0c;打造小红书品牌&#xff01; 一、品牌五感是什么 …

机器学习中的一些有趣点【Attack 和 Defence】

什么是机器学习中的攻击 “攻击机器学习模型” 指的是试图危害或操纵机器学习模型的概念。有各种类型的攻击机器学习模型的方法&#xff0c;它们可以广泛分为几类&#xff1a; 对抗攻击&#xff1a; 定义&#xff1a; 对抗攻击涉及对输入数据进行微小的、通常是难以察觉的更改…

k8s的资源管理

命令行: kubectl命令行工具优点: 90%以上的场景都可以满足 对资源的增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好缺点:命令比较冗长&#xff0c;复杂难记 声明方式&#xff1a;k8s当中的yaml文件实现资源管理----声明式GUI:图形化工具的管理。 查看k8s的…

TP-LINK 路由器忘记密码 - 恢复出厂设置

TP-LINK 路由器忘记密码 - 恢复出厂设置 1. 恢复出厂设置2. 创建管理员密码3. 上网设置4. 无线设置5. TP-LINK ID6. 网络状态References 1. 恢复出厂设置 在设备通电的情况下&#xff0c;按住路由器背面的 Reset 按钮直到所有指示灯同时亮起后松开。 2. 创建管理员密码 3. 上网…

解锁小程序UI设计的奥秘:必须知晓的相关事项

一、什么是小程序 2016年张小龙首次提出小程序概念&#xff0c;全称为“微信小程序”&#xff0c;英文名为“微信小程序”MiniProgram它是一种基于微信生态系统、开发周期短、成本低、无需下载安装、即用即走的应用。 到目前为止&#xff0c;小程序不仅是微信独有的&#xff…

lv13 内核模板编译方法 7

1 内核模块基础代码解析 Linux内核的插件机制——内核模块 类似于浏览器、eclipse这些软件的插件开发&#xff0c;Linux提供了一种可以向正在运行的内核中插入新的代码段、在代码段不需要继续运行时也可以从内核中移除的机制&#xff0c;这个可以被插入、移除的代码段被称为内…

喜讯|极狐GitLab 通过信通院汽车软件研发效能成熟度模型能力

12 月 27 日&#xff0c;在由中国信息通信研究院&#xff08;下称信通院&#xff09;、中国通信标准化协会联合主办的2023系统稳定性与精益软件工程大会-汽车云质效专场峰会上&#xff0c;信通院发布了“2023年下半年汽车云评估结果”&#xff0c;极狐GitLab 一体化 DevOps 平台…

thinkphp+vue_mysql汽车租赁管理系统1ma2x

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 课题主要分为三大模块&#xff1a;即管理员模块、用户模块…

Appstore上架:2023年度总结

今天是2023年的最后一个工作日&#xff0c;今天用来总结一下2023年关于苹果上架的相关政策改动和对应的拒审邮件解决方法。 目录 了解有关Apple开发者的最新活动、故事和资讯指南拒审邮件及解决对应方法 了解有关Apple开发者的最新活动、故事和资讯指南 官方新闻和更新记录 官…

Shell三剑客:awk(awk编辑编程)五

一、前言 AWK 可以使用关联数组这种数据结构&#xff0c;索引可以是数字或字符串。AWK关联数 组也不需要提前声明其大小&#xff0c;因为它在运行时可以自动的增大或减小。 二、数组语法格式 array_name[index]valuearray_name&#xff1a;数组的名称index&#xff1a;数组索…

使用rust读取usb设备ACR122U的nfc卡片id

rust及其高效和安全著称&#xff0c;而且支持跨平台&#xff0c;所以就想使用这个rust开发一个桌面端程序&#xff0c;来读取nfc设备的nfc卡片的id信息&#xff0c;下面就做一个最简单的入门教程吧&#xff0c;也是我写的第三个rust应用。 当你电脑上安装好了rust环境之后&…

UGUI:一个轻量级的TFTLCD彩色显示屏GUI库

目录 一、引言 二、移植说明 三、如何使用UGUI函数 2.1 UGUI函数介绍 2.2 窗口控件管理 2.3 如何建立一个按键 四、如何实现触摸控制 一、引言 UGUI是一个经过精心设计的轻量级TFT-LCD彩色显示屏GUI库&#xff0c;旨在为用户提供高效、稳定且易于使用的图形用户界面。该…

第五课:集成电路与摩尔定律(硬件的发展)、操作系统、内存和储存介质(存储技术的发展)、文件系统、压缩、命令行界面及屏幕与 2D 图形显示

第五课&#xff1a;集成电路与摩尔定律&#xff08;硬件的发展&#xff09;、操作系统、内存和储存介质&#xff08;存储技术的发展&#xff09;、文件系统、压缩、命令行界面及屏幕与 2D 图形显示 第十七章&#xff1a;集成电路与摩尔定律&#xff08;硬件的发展&#xff09;1…