object.defineProperty用法

embedded/2024/10/18 12:55:10/

Object.defineProperty 是 JavaScript 中一个用于定义对象属性的静态方法。它允许你精确控制对象的属性,包括属性的值、可写性、可枚举性和可配置性等特性。这个方法在需要定义特殊的属性行为时非常有用,例如,在 Vue.js 中,它常用于实现数据的响应式系统。

基本语法

javascript">Object.defineProperty(obj, prop, descriptor)
  • obj:要定义属性的对象。
  • prop:要定义的属性名。
  • descriptor:一个描述符对象,指定属性的特性。

属性描述符(descriptor)

描述符对象可以包含以下属性:

  1. value:属性的值。默认是 undefined
  2. writable:布尔值,表示属性是否可以被修改。默认是 false
  3. enumerable:布尔值,表示属性是否会出现在 for...in 循环中以及 Object.keys 方法中。默认是 false
  4. configurable:布尔值,表示属性是否可以被删除或修改其特性。默认是 false
  5. get:一个函数,表示当访问属性值时要执行的函数。默认是 undefined
  6. set:一个函数,表示当设置属性值时要执行的函数。默认是 undefined

示例

1. 定义一个基本属性
javascript">let obj = {};
Object.defineProperty(obj, 'name', {value: 'John',writable: true,enumerable: true,configurable: true
});console.log(obj.name); // John
obj.name = 'Doe';
console.log(obj.name); // Doe

在这个例子中,我们创建了一个属性 name,它的值是 'John',并且可以被修改(writable: true)、可以被枚举(enumerable: true),并且可以被重新定义或删除(configurable: true)。

2. 只读属性
javascript">let obj = {};
Object.defineProperty(obj, 'age', {value: 30,writable: false,enumerable: true,configurable: true
});console.log(obj.age); // 30
obj.age = 35;
console.log(obj.age); // 30 (无法修改)

在这个例子中,属性 age 的值是 30,但由于 writable 设置为 false,它的值无法被修改。

3. 使用 getset 方法
javascript">let obj = {internalValue: 0
};Object.defineProperty(obj, 'value', {get() {return this.internalValue;},set(newValue) {this.internalValue = newValue;}
});console.log(obj.value); // 0
obj.value = 10;
console.log(obj.value); // 10

在这个例子中,value 属性使用了 getset 方法。访问 value 属性时会调用 get 方法,设置 value 属性时会调用 set 方法。

4. 定义不可枚举属性
javascript">let obj = {};
Object.defineProperty(obj, 'hidden', {value: 'secret',enumerable: false,configurable: true
});console.log(Object.keys(obj)); // []
console.log(obj.hidden); // secret

在这个例子中,属性 hidden 是不可枚举的,因此它不会出现在 Object.keys() 的结果中,但它仍然可以通过 obj.hidden 访问。

总结

Object.defineProperty 允许你以非常细粒度的方式定义对象的属性及其行为。通过使用属性描述符,你可以控制属性的读写、枚举和配置行为,这对于创建复杂的对象和实现自定义行为非常有用。


http://www.ppmy.cn/embedded/100331.html

相关文章

OD C卷 - Wonderland游乐园

Wonderland游乐园(200) 游乐园有四种售票方式,分别为一日票,三日票,周票(7天)、月票(30天);每种票据在时限内可以无限制游玩,如第10天买了一个三…

通过建模走出人工智能寒冬

很多人对 GenAI 是否会产生商业影响持怀疑态度,但我认为他们不仅错了,而且犯了 2001 年人们在互联网上犯下的错误。他们认为硅谷的炒作是无稽之谈,因此其背后的想法也是无稽之谈。 这是很危险的,我认为,这比大多数零售…

DC-DC开关电源稳压电路设计——7- 40V转换5V和3.3V

本篇文章记录分享DC-DC开关电源稳压(7-40V转换5V和3.3V)电路设计的思路及原理图。 目录 一、电路稳压原理图 二、开关稳压芯片 1、BUCK降压电路 2.LM2596 (1)、LM2596简介 (2)、LM2596原理 1. 基…

BAT32G137国产项目通用第五节:FreeRTOS 互斥量

主题:互斥量的使用比较单一,因为它是信号量的一种,并且它是以锁的形式存在。在初始 化的时候,互斥量处于开锁的状态,而被任务持有的时候则立刻转为闭锁的状态。互斥量 更适合于: 1.可能会引起优先级翻转的情况。 递归互斥量更适用于。 2.任务可能会多次获取互斥量的情…

vs code中编写html的配置,插件安装

首先安装vs code 插件安装下面三个: 功能分别是: html css support :就是支持html环境,因为vs code就是一个文本编辑器 live server:自动更新编写的文件在浏览器刷新 auto rename tag:自动修改另一半标签…

Python技能进阶:探索Selenium库,实现网页自动化测试与爬虫

一、引言 在数字化时代,网页自动化测试与爬虫成为了许多开发者必备的技能之一。Python作为一门功能强大的编程语言,拥有许多优秀的库可以帮助我们实现这一目标。其中,Selenium库以其强大的功能和广泛的应用领域,受到了广大开发者…

企业中需要哪些告警Rules

文章目录 企业中需要哪些告警Rules前言定义告警规则企业中的告警rulesNode.rulesprometheus.ruleswebsite.rulespod.rulesvolume.rulesprocess.rules 总结 企业中需要哪些告警Rules 前言 Prometheus中的告警规则允许你基于PromQL表达式定义告警触发条件,Prometheus…

IP进程间的通信方式以及不同主机间的通信方式

一,IP进程间的通信方式 共享内存(最高效) 1.是一块内核的预留空间 2.避免了用户空间到内核空间的数据拷贝 1.产生key:ftok函数 功能:将pathname和pid_id转化为key 参数:(路径名,A) 返回值&#xff1…