详解Object.defineProperty

Object.defineProperty

3个参数

  • obj: 可以理解为目标对象。
  • prop: 目标对象的属性名。
  • descriptor: 对属性的描述。

descriptor可分为数据属性和访问器属性两类

//4个数据描述符value,configurable,enumerable,writablelet obj = {};Object.defineProperty(obj, "name", {value: 'ddd',// 这三个参数默认都为falseconfigurable: true, // 是否可删除enumerable: true,   // 是否可枚举writable: true,     //  是否可修改})
//访问器描述符的含义是:包含该属性的一对 getter/setter方法的对象let obj = {};Object.defineProperty(obj, 'name', {configurable: false,  //是否可删除enumerable: false,// 是否可枚举get() {},set(newValue) {}})

注意:
1,使用访问器描述符中 getter或 setter方法的话,不允许使用 writable 和 value 这两个配置项。
2,不能在set方法里设置当前的属性值.会报栈溢出.原因是会造成死循环。

    // 例1   用对象中不存在的属性,借助get和set实现获取和设置对象中存在的属性let obj = { name_: '小红' };Object.defineProperty(obj, 'name', {get() {console.log("get被拦截")return this.name_},set(newValue) {console.log("set被拦截")this.name_ = newValue}})obj.name = "小明"console.log(obj.name)   //小明console.log(obj)       //{name_:'小明'}

简单实现数据双向绑定

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><h1>简单实现数据双向绑定</h1><input type="text" id="inp"><p></p></head><body><script>const inp = document.getElementById('inp')const p = document.getElementsByTagName('p')[0]const obj = { text: '' }inp.oninput = (e) => {obj.text = e.target.value}Object.defineProperty(obj, 'text', {set(v) {inp.value = vp.innerHTML = v}})</script>
</body></html>

对数组的监听

    const obj = {}let a = 1;Object.defineProperty(obj, 'arr', {get() {return a},set(v) {console.log('set执行', v)a = v}})obj.arr = []      //set执行obj.arr = [1, 2, 3]   // 给obj中的arr属性添加1,2,3, 会执行set方法obj.arr[0] = 3        //set不执行obj.arr.push(4)        // set不执行obj.name.length = 5   // 也不会执行set方法

如上执行结果我们可以看到,当我们使用 Object.defineProperty 对数组赋值有一个新对象的时候,会执行set方法,但是当我们改变数组中的某一项值的时候,或者使用数组中的push等其他的方法,或者改变数组的长度,都不会执行set方法。也就是如果我们对数组中的内部属性值更改的话,都不会触发set方法。因此如果我们想实现数据双向绑定的话,我们就不能简单地使用 obj.name[1] = newValue; 这样的来进行赋值了。那么对于vue这样的框架,那么一般会重写 Array.property.push方法,并且生成一个新的数组赋值给数据,这样数据双向绑定就触发了

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

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

相关文章

一文搞懂redis

简介&#xff1a;NoSQL泛指非关系型数据库&#xff0c;随着web2.0互联网的诞生&#xff0c;传统的关系型数据库很难对付web2.0大数据时代&#xff01;尤其是超大规模的高并发的社区&#xff0c;暴露出来很多难以克服的问题&#xff0c;NoSQL在当今大数据环境下发展的十分迅速&a…

热搜!华为 30 岁以下员工仅占 28%,网友:35 岁危机呢?

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;一直以来&#xff0c;程序员的“35 岁”都是圈内的热议话题&#xff1a;35 岁是程序员的职业终结点、程序员到 35 岁就废了、超过 35 岁的程序员容易被裁……久而久之&#xff0c;35 岁逐渐变成了一个很…

阿里云发布业界首本《云计算公网质量白皮书》

随着互联网的发展&#xff0c;网络已经融入了整个社会发展的进程&#xff0c;如同血液贯通人类文明的五脏六腑。一旦网络出现故障&#xff0c;将给社会的政治、经济、文化造成重大损失。 2021年10月4日&#xff0c;Facebook在地球上”消失”了6小时&#xff0c;市值跌掉3000亿…

初识vue3

对vue3的理解 2020年9月发布的正式版vue3支持大多数的Vue2的特性Vue中设计了一套强大的组合APi代替了Vue2中的option API&#xff0c;复用性更强了更好的支持TS最主要&#xff1a;Vue3中使用了Proxy配合Reflect代替了Vue2中Object.defineProperty()方法实现数据的响应式&#…

选轻量应用服务器or云服务器ECS?一图帮你彻底区分

简介&#xff1a;轻量应用服务器适合轻量级且访问量低的应用场景&#xff0c;更适合个人开发者、对新手小白更友好&#xff1b;而云服务器ECS可覆盖全业务场景&#xff08;如大数据分析&#xff0c;深度学习等&#xff09;&#xff0c;要求用户有一定的开发技术能力。 本文首发…

js实现shallowReactive和reactive

// shallowReactive(浅的监视&#xff0c;浅的劫持&#xff0c;浅的响应式数据)与reactive&#xff08;深的&#xff09;// 定义一个reactiveHandler处理对象 let reactiveHandler {// 获取属性值get(target, prop) {// 这里的result返回1const result Reflect.get(target, p…

宜搭小技巧|一招摆脱纸质表单,数据收集更便捷

简介&#xff1a;开启「应用公开访问」&#xff0c;组织外成员也可提交数据。 许多公司在前台都会准备一个访客登记表&#xff0c;供来访者填写。但如果来访者数量较多&#xff0c;就会出现这样的问题…… 提供纸质表单供访客填写信息&#xff0c;使用起来繁琐且费时&#xff…

如何用 Serverless 低成本打造个人专属网盘?

简介&#xff1a;想要做个网盘不知如何开始&#xff0c;不妨花3分钟读读这篇&#xff0c;看看如何借助 Serverless &#xff0c;低成本的做一个“不限制网速、无限扩展、同时支持数百种文件格式在线预览、编辑、协作”的专属个人 & 家庭网盘~ 前言 随着全球大数据不断增长…

云之后,亚马逊云科技要为业界提供水和空气一样的安全防护

云巨头亚马逊云科技&#xff0c;正在持续加码云安全。 编辑 | 宋慧 出品 | CSDN云计算 提到亚马逊云科技&#xff0c;我们首先想到的是它在云领域的计算存储等技术和优势。不过亚马逊云科技却连续四年在举办它的全球安全大会 re:Inforce&#xff0c;刚刚 &#xff0c;2022 re:…

即学即会 Serverless | 如何解决 Serverless 应用开发部署的难题?

简介&#xff1a;开发者在选择使用 Serverless 时&#xff0c;仍会有开发和部署困难、厂商锁定等诸多担忧&#xff0c;有没有一种支持 Serverless 应用全生命周期管理的开发者工具&#xff0c;能够简单快速上手并真正帮助我们提升研发、运维的效能的呢&#xff1f; 破局&#x…

NBF事件中心架构设计与实现

简介&#xff1a;NBF是阿里巴巴供应链中台的基础技术团队打造的一个技术PaaS平台&#xff0c;她提供了微服务FaaS框架&#xff0c;低代码平台和中台基础设施等一系列的PaaS产品&#xff0c;旨在帮助业务伙伴快速复用和扩展中台能力&#xff0c;提升研发效能和对外的商业化输出。…

常用的git指令

命令行常用命令&#xff08;在git bash上生效&#xff0c;部分在cmd无用&#xff09; pwd (print working directory) 查看当前所在路径–绝对路径cd(change directory) 切换目标ls(list) 查看当前目录下的内容mkdir(make directory) 创建目录touch 创建文件cat 查看文件内容&…

关于“算力”,这篇文章值得一看

作者 | 小枣君来源 | 鲜枣课堂今天这篇文章&#xff0c;我们来聊聊算力。这两年&#xff0c;算力可以说是ICT行业的一个热门概念。在新闻报道和大咖演讲中&#xff0c;总会出现它的身影。那么&#xff0c;究竟到底什么是算力&#xff1f;算力包括哪些类别&#xff0c;分别有什么…

宜搭小技巧|找不到应用怎么办?群应用一键直达

简介&#xff1a;5步学会「一键添加群应用」&#xff01; 上期钉多多将Excel一键转应用后&#xff0c;大大提高了同学们的工作效率&#xff0c;于是小伙伴们纷纷用钉钉宜搭创建了各种各样的应用&#xff0c;那么新的问题产生了...... 每次提交数据都要切换到工作台找到对应的…

前端实现多文件编译器

简介&#xff1a;在前端工程中&#xff0c;有时我们需要在浏览器编译并执行一些代码&#xff0c;这种需求常见于低代码场景中。例如我们在搭建时需自定义一部分代码&#xff0c;这些代码需要在渲染时执行。为了方便起见&#xff0c;我们写的代码一定是 ES6 语法&#xff0c;如果…

3个月夯实基建,鲜丰水果这样实现研发数字化

简介&#xff1a;3个月夯实基建&#xff0c;鲜丰水果这样实现研发数字化。简单、快速地提升产研团队的交付质量和交付效率&#xff0c;成为了支持组织业务创新的必选项。让我们一起看看鲜丰究竟如何逐步破局。 鲜丰水果&#xff0c;创始于1997年&#xff0c;历经25年发展史的鲜…

打通源码,高效定位代码问题|云效工程师指北

简介&#xff1a;为了帮助企业和团队挖掘更多源代码价值以赋能日常代码研发、运维等工作&#xff0c;云效代码团队在大数据和智能化方向进行了一系列的探索和实践&#xff08;例如代码搜索与推荐&#xff09;&#xff0c;本文主要介绍我们如何通过直接打通源代码来提高研发与运…

Nreal中国AR眼镜发布会:正式推出Nreal X和Nreal Air 售价2299元起

2022年8月23日&#xff0c;全球领先的消费级AR眼镜品牌Nreal在京召开中国首场AR眼镜发布会&#xff0c;面向中国市场正式推出三款硬件产品&#xff0c;其中包括两款AR眼镜&#xff1a;全球首款眼镜形态、探索增强现实技术无限场景应用的全功能AR眼镜——Nreal X&#xff1b;全新…

大数据时代下的App数据隐私安全

简介&#xff1a;随着信息技术快速发展&#xff0c;大数据为我们带来信息共享、便捷生活的同时&#xff0c;还存在着数据安全问题&#xff0c;主流商业模式下APP面临新的挑战。工信部持续开展APP侵权整治活动&#xff0c;进行了了六批次集中抽检&#xff0c;检查了76万款APP&am…

react知识总结

react是什么 用于动态构建用户界面的javaScript库 &#xff08;只关注视图&#xff09; react是谁开发的 由Facebook开发&#xff0c;且开源。 react的优点 1、高效&#xff0c;使用虚拟DOM优秀的Diff算法&#xff0c;尽量减少与真实DOM的交互 2、组件化开发 3、声明式编码…