当前位置: 首页 > news >正文

Web前端—属性描述符

属性描述符

假设有一个对象obj

var obj = {a:1
}

观察这个对象,我们如何来描述属性a

  • 值为1
  • 可以重写
  • 可以遍历
  • 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符
var desc = Object.getOwnPropertyDescriptor(obj, 'a');
console.log(desc);

我们会得到一个对象
观察这个对象中的内容

  • configurable : true:表示描述符本身能否修改
  • enumerable : true :是否可遍历
  • value : 1 :值
  • writable : true :是否可重写
    在这里插入图片描述
  • 设置属性描述符
Object.defineProperty(obj, 'a', {value:10,writable:false //表示不可重写
});
console.log(obj.a); // 10
  • :如果修改了configurable的值为false,后续再次修改属性描述符会报错。
Object.defineProperty(obj, 'a', {configurable:false
});
Object.defineProperty(obj, 'a', {value:20,
});
console.log(obj.a);

在这里插入图片描述

  • 但是,如果属性设置了不可重写,后续进行修改,虽然不会报错,但是不会修改成功
Object.defineProperty(obj, 'a', {value:10,writable:false //表示不可重写
});
console.log(obj.a); // 10
obj.a = 20;
console.log(obj.a); // 10

因此,如果属性不能重写,后续修改最好能进行报错,告诉用户哪句话出现了问题。

  • 为了解决上面的问题,Object.defineProperty中有两个函数
    • 读取器 getter
    • 设置器 setter

当读取属性a的值的时候会运行get函数,设置属性a的值的时候会 运行set函数

Object.defineProperty(obj, 'a', {get:function(){console.log("get函数");},set:function(val){console.log("set函数");}
});
obj.a = 20;  // set函数
console.log(obj.a);  // get函数

:这里需要注意一个问题—无限递归问题

  • 如果在get中读取属性,或者在set中设置属性的值,则会出现无限递归问题
Object.defineProperty(obj, 'a', {get:function(){return obj.a;},set:function(val){obj.a = val;}
});
obj.a = 20;
console.log(obj.a);

在这里插入图片描述

  • 使用样例
var internalValue = obj.a;
Object.defineProperty(obj, 'a', {get:function(){console.log("get函数");return internalValue;},set:function(val){console.log("set函数");internalValue = val;return internalValue;}
});
obj.a = 20; // set函数
console.log(obj.a); // get函数 20
  • 因此,假设该属性不能重写,可以在set函数中抛出一个报错信息,提示用户
Object.defineProperty(obj, 'a', {get:function(){console.log('get函数');},set:function(val){throw new Error(`报错信息:该属性不能赋值,你正在给这个属性赋值为${val}`);}
})
console.log(obj.a);
obj.a = 20;

在这里插入图片描述

当然,这里面也会出现问题需要考虑,具体出现的问题具体分析。

相关文章:

  • mySql数据库学习002-表数据查询操作
  • three.js尝试渲染gbl模型成功!(三)
  • unable to find a medium containing a live file system解决办法!
  • c++的学习之路:22、多态(1)
  • 【MATLAB源码-第184期】基于matlab的FNN预测人民币美元汇率 输出预测图误差图RMSE R2 MAE MBE等指标
  • [lesson17]对象的构造(上)
  • 设计模式:适配器模式
  • Linux 内核的构建块:深入探索 C 结构体的应用
  • 蓝桥杯-冶炼金属(二分求最大最小)
  • 搭建前后端的链接(java)
  • 5.4Python之可变类型与列表的深浅拷贝
  • React 状态管理:安全高效地修改对象属性的 3 种方法
  • Linux CPU利用率
  • 通往 AGI 的道路上,OpenAI 逐渐构建了全模态的工具集
  • 【算法优选】 动态规划之简单多状态dp问题——贰
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【知识碎片】第三方登录弹窗效果
  • iOS | NSProxy
  • Redis 中的布隆过滤器
  • Vue学习第二天
  • Xmanager 远程桌面 CentOS 7
  • 安卓应用性能调试和优化经验分享
  • 反思总结然后整装待发
  • 那些年我们用过的显示性能指标
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 网页视频流m3u8/ts视频下载
  • 学习Vue.js的五个小例子
  • 《天龙八部3D》Unity技术方案揭秘
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #HarmonyOS:基础语法
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $.proxy和$.extend
  • %@ page import=%的用法
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (一)认识微服务
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core跨平台微服务学习资源
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net对接阿里云CSB服务
  • @private @protected @public
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [Android]Tool-Systrace
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [IE编程] 如何获得IE版本号
  • [iOS]随机生成UUID通用唯一识别码
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [LeetCode]—Roman to Integer 罗马数字转阿拉伯数字