理解 Object.defineProperty
理解 Object.defineProperty
本文写于 2020 年 10 月 13 日
Object.defineProperty 用于在一个对象上定义新的属性或修改现有属性并返回该对象。
什么意思呢?先不慌着理解,来一个例子看看再说。
const obj1 = {};
Object.defineProperty(obj1, 'property1', {
value: 42,
writable: false,
});
obj1.property1 = 77;
console.log(obj1.property1); // 42
上过小学二年的同学都能看懂这段英文,说的是
- 我们在
obj1上定义一个 property(可以理解是一个属性或者元素); - 这个 property 的名字叫做
property1; property1的值为42;- 她不可以被改写。
因此我们访问 obj1 这个空对象的 property1 属性可以得到结果,但是一旦我们想要修改对应的值,会发现修改失败。
语法
Object.defineProperty(obj, prop, descriptor);
obj要操作的对象,也就是 target。
prop要新增或者修改的属性名称(可以是 Symbol)。
descriptor一个对象,用于描述你的新增或是修改。
具体属性如下:
interface Descriptor {
configurable?: boolean;
enumerable?: boolean;
value?: any;
writable?: boolean;
get?: () => any;
set?: (value: any) => void;
}
上面使用了一下 TS 的接口写法,不理解的同学可以看一下文档。
总的来说,如果我们简单的使用 const obj = { a: 1 }; 来定义对象的属性,那么该属性是可以修改或做出其他很多操作的;但如果使用 Object.defineProperty(),在不添加 descriptor 属性的前提下,该属性就是immutable(不可修改)的。
Descriptor
descriptor 拥有 6 个属性,可以分为两大类:数据描述符和存取描述符。
很容易猜到,get 与 set 就是存取描述符,其他的 4 个都是数据描述符。
让我们逐一击破。
configurable
顾名思义,指的是该属性是否可以进行配置,也就是说只有该选项为 true,属性值才能被改变或者删除。
该属性默认为 false。
enumerable
该属性译为「数不清的」,因此我们能猜到,该属性和枚举相关。
当它为 true 时,该属性才会出现在对象的枚举属性中。
默认为 false。
value
不多解释,可以为任何有效的 JavaScript 数据,是该属性对应的值。
默认为 undefined。
writable
描述该属性是否可以修改,与 configurable 不同的在于,即使 writable 设置为 false,该属性也可以做出删除或其他修改以外的操作。该选项只对赋值运算符起作用。
默认为 false。
get
配置了该属性的 getter 函数。每当我们访问这个属性,就会调用 get。比如 console.log(obj.a)。该函数配置的返回值就将会是访问获得的值。
该函数不接受任何参数,但是存在 this 对象(但是不确定会指向谁)。
默认值为 undefined。
set
配置该函数的 setter 函数。当属性值被修改时,就会调用该函数。
函数接收一个参数,该参数就是即将修改的新值。同样,该函数也存在 this。
默认值为 undefined。
(完)
理解 Object.defineProperty的更多相关文章
- 理解Object.defineProperty()
理解Object.defineProperty() Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 基本语法:Obj ...
- 深入理解 Object.defineProperty 及实现数据双向绑定
Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...
- 理解Object.defineProperty函数中的get与set
defineProperty是什么: 该函数可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象.通俗理解就是: 给对象添加一个新的属性,或者针对对象里的某些属性,可以给这 ...
- 理解Object.defineProperty的作用
对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...
- [转] 理解Object.defineProperty的作用
对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...
- 《转》理解Object.defineProperty的作用
对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...
- 简单的理解 Object.defineProperty()
Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性. Object.defineProperty(obj,prop,descriptor ...
- vue之Object.defineProperty()
了解Object.defineProerty()方法 关于Object.defineProperty()方法的解释,理解Object.defineProperty的作用 这篇文章做了很详细的概述 关于 ...
- 浅谈兔兔对Object.defineProperty的理解
给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参数1:目标对象 参数2:要修改或者添加的属性名称 ...
随机推荐
- 学习RabbitMQ(四)
I. 消息中间件特点: 1,异步处理模式 消息发送者可以发送一个消息而无需等待响应,消息发送者将消息发送到一条虚拟的通道或队列上,消息接收者则订阅或监听该通道,一条消息可能最终转发给一个或多个消息 ...
- vue循环时设置多选框禁用状态,v-for
<div v-for="user in users" > <el-radio v-bind:disabled="user.id== ...
- 基本类型数组转List
基本类型数组转List 小数 double[] src = {1.1,2.1,3.1}; List<Double> list = Arrays.stream( src ).boxed(). ...
- ARM指令集详解--汇编
1. 汇编 1.1. 通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...
- Ubuntu 18.04 磁盘根目录在线扩容 & 修改分区 inode 数量
Ubuntu 18.04 磁盘根目录在线扩容 & 修改分区 inode 数量 Ubuntu 作为服务器系统使用的时候,系统盘的空间可能并不是很充裕,apt apt 着,根目录就满了.诚然, ...
- USB与电池切换电路图
- javascript新手实例1-DOM基本操作
学习javascript好多同学不知道怎么上手,跟着网上的新手教程做了一遍又觉得javascript很简单,但是真正自己用起来又觉得写不出什么东西,我觉得学习最好的方法就是跟着有趣的例子做,所以我们的 ...
- 新版vue作用域插槽的使用
2.6开始,作用域插槽的使用有了不同的地方: 作用域插槽的个人理解就是让子组件的数据可以在父组件中使用: 也是一个数据传递的方式了: 不多说,上代码 子组件定义一个插槽,并且定义一个需要传递到父组件 ...
- Python入门-分支循环结构
编写代码的过程中,除了基本的变量,数据类型,在实际开发中,大量代码是根据判断条件,进而选择不同的的向前运行方式. 这些向前的运行方式基本分为两种:分支结构,循环结构 1.分支结构 if单分支结构 # ...
- Linux利用crontab创建计划任务详解
crontab 周期性计划任务 cron是Linux下的定时执行工具,可以在无需人工干预的情况下运行作业. 当需要周期性地重复执行任务时可以使用cron服务:该服务每分钟检查一次,并执行符合条件的任务 ...