Object.defineProperty到底有啥用

news/2024/11/30 0:48:18/

Object.defineProperty

Object.defineproperty 的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性

使用Object.defineProperty之前

number和person之间并无关联
在这里插入图片描述

使用Object.defineProperty之后

person和number之间有了关联;修改person.age之后,number发生了变化;修改number之后,person.age变化了
在这里插入图片描述
*get:当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值

set:当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值*

对象的属性描述符

①对象除了我们最初理解的key,value键值对形式,还有其他的属性描述符,如下:
②writable 对象的某个value能否更改;
③enumerable 能够被列出;
④configurable 能够被删除
对象不只是有value属性描述符

使用普通方法创建对象之后,他的属性描述符writable enumerable configurable默认都是true

let user = {name: "John"
};
//获取user对象的name属性的描述符
let descriptor = Object.getOwnPropertyDescriptor(user, 'name');alert( JSON.stringify(descriptor, null, 2 ) );
/* 属性描述符:
{"value": "John","writable": true,"enumerable": true,"configurable": true
}
*/

如果使用Object.defineProperty(obj, propertyName, descriptor)创建对象的某一属性,那么上面的三个属性描述符默认是false
obj是对象;propertyName是属性名;descriptor是属性描述符对象

let user = {};Object.defineProperty(user, "name", {value: "John"
});let descriptor = Object.getOwnPropertyDescriptor(user, 'name');alert( JSON.stringify(descriptor, null, 2 ) );
/*
{"value": "John","writable": false,"enumerable": false,"configurable": false
}*/

Object.defineProperties一次定义多个属性

Object.defineProperties(user, {name: { value: "John", writable: false },surname: { value: "Smith", writable: false },// ...
});

对象的另外一种属性:访问器属性 getter setter

①对象属性包括数据属性(常规的)和访问器属性
②访问器属性有getter和setter两个函数组成,可以用来随时改变对象中的属性值;
③当读取对象中某一个属性的时候,触发getter函数
④当修改对象中的某一个属性的时候,触发setter函数
⑤访问器属性对内表现为getter、setter函数,对外仍然表现为某一个数据属性
访问器属性讲解参考

现在我们想添加一个 fullName 属性,该属性值应该为 “John Smith”。当然,我们不想复制粘贴已有的信息,因此我们可以使用访问器来实现:

let user = {name: "John",surname: "Smith",get fullName() {return `${this.name} ${this.surname}`;}
};alert(user.fullName); // John Smith

通过为 user.fullName 添加一个 setter 来修改属性值

let user = {name: "John",surname: "Smith",get fullName() {return `${this.name} ${this.surname}`;},set fullName(value) {[this.name, this.surname] = value.split(" ");}
};// set fullName 将以给定值执行
user.fullName = "Alice Cooper";alert(user.name); // Alice
alert(user.surname); // Cooper

访问器描述符

对于访问器属性,没有 value 和 writable,但是有 get 和 set 函数。
所以访问器描述符可能有:
get —— 一个没有参数的函数,在读取属性时工作,
set —— 带有一个参数的函数,当属性被设置时调用,
enumerable —— 与数据属性的相同,
configurable —— 与数据属性的相同。

请注意,一个属性要么是访问器(具有 get/set 方法),要么是数据属性(具有 value),但不能两者都是。
如果我们试图在同一个描述符中同时提供 get 和 value,则会出现错误:

// Error: Invalid property descriptor.
Object.defineProperty({}, 'prop', {get() {return 1},value: 2
});

总结

在这里插入图片描述


http://www.ppmy.cn/news/141008.html

相关文章

AT32F403A驱动复用PSRAM

AT32F403A驱动复用PSRAM 实验目的: 最近使用AT32F403A做项目,需要外扩PSRAM用来存储程序运行中间数据,所以记录一下心路历程。开干! 实验步骤: 硬件选型主控芯片:看题目就知道啦,就是雅特力科技…

入门图形学:图形学原理(二)

紧接上一篇:https://blog.csdn.net/yinhun2012/article/details/79865679 这篇我们了解一下“显示处理器”,也称为GPU,显卡,视觉处理器等等,也就是做图像处理工作的微处理器芯片。我们对显卡应该不陌生,毕竟…

TPS5430DDAR 学习笔记

一.特性 1.输入电压范围:5.5-3.3V 2.输出电流:高达 3A 的持续(峰值为 4A) 3.过 110mΩ 集成式 MOSFET 开关实现高达 95% 的高效率 4.输出电压范围:可调节为低至 1.22V 5.500kHz 开关频率 (更小输出电感&…

Thinkpad T480 Win7 安装 INTEL HD620显卡驱动

问题描述 Thinkpad T480安装Win7操作系统,使用驱动精灵安装驱动程序,安装显卡驱动时无法正常安装。 解决方法 去Intel官网下载显卡驱动: 文件:win64_154519.4678.zip https://downloadcenter.intel.com/download/26836/Intel-Graphics-Driver-for-Windows-15-45- 解…

《Linux驱动:s3c2440 lcd 驱动分析--终结篇》

文章目录 一,前言二,LCD原理和硬件分析2.1 LCD原理解析2.2 硬件电路2.2.1 LCD背光电路2.2.2 LCD屏2.2.3 S3c2440主控 三,LCD应用平台总线-设备-驱动模型3.1 lcd 设备的加载和注册3.2 lcd 驱动的加载和注册3.2.1 编译进内核,加载驱…

A40I led driver

LDE DRIVER 亲试有效 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/cdev…

ati hd 6470m驱动

ati hd 6470m驱动是官方提供的一款显卡驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决显卡不能正常运行&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Windows 10 32/64位操作系统。有需要的朋友可以来本…

Linux-2440下的DMA驱动(详解)

DMA(Direct Memory Access) 即直接存储器访问&#xff0c; DMA 传输方式无需 CPU 直接控制传输&#xff0c;通过硬件为 RAM 、I/O 设备开辟一条直接传送数据的通路&#xff0c;能使 CPU 的效率大为提高。 学了这么多驱动&#xff0c;不难推出DMA的编写套路: 1)注册DMA中断,分…