理解 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:要修改或者添加的属性名称 ...
随机推荐
- Kube-OVN:大型银行技术团队推荐的金融级云原生网络方案
近日,由TWT社区主办的2021容器云职业技能大赛团队赛的冠军作品:<适用于大中型银行的云原生技术体系建设方案>中,Kube-OVN成为银行技术团队推荐的金融级云原生网络最佳实践.本文部分 ...
- printf()函数压栈a++与++a的输出
printf()中a++与++a的输出问题 在C语言中有个很常用的函数printf(),使用时从右向左压栈,也就是说在printf("%d %d %d %d\n",a,a++,++ ...
- 利用angular4和nodejs-express构建一个简单的网站(一)——构建前后端开发环境
学习了一段时间的angular4知识,结合以前自学的nodejs-express后端框架知识,做了一个利用angular4作为前端,node-express作为后端服务器的网站.这个网站的功能很简单, ...
- Spark入门之idea编写Scala脚本
一.安装Scala插件 1.File->Settings 2.Plugins->Msrketplace->搜索Scala并安装 (或者自己下载合适的scala版本,教程:自己给ide ...
- 简单的axios请求返回数据解构赋值
本地 data.json 文件 { "name": "大熊", "age": 18, "fnc": [ 1, 2, 3 ...
- EMS导入导出邮箱
Exchange支持EMS命令导出用户邮箱内容作为备份的功能.当重要用户的邮件误删除后,可以通过导出的邮箱恢复数据. 1.授权管理用户 Exchange默认安装完成后,内置"Mailbox ...
- 利用css3实现3D轮播图
动画实现主要利用了z-index将层级关系改变,从而实现了焦点图的效果:css3属性 transform rotate 来实现图片的动画效果 .transition实现过度动画! * { margin ...
- XXE漏洞——介绍及利用
什么是xxe XML外部实体注入,简称XXE漏洞.XML文档结构包括XML声明,DTD文档类型定义,文档元素. XML示例 <?xml version="1.0"?>X ...
- 如何得到个性化banner
介绍 有时候用一些脚本工具,会有一些由其他字符组成的字符.(如下面这个我还在写的) 使用 kali自带了这个工具 -- figlet. figlet AuToIP 就可以得到上面的字符啦! 另外如果想 ...
- datasets数据读取器
#切分数据集 img_dir = train_parameters['img_dir'] file_name = train_parameters['file_name'] df = pd.read_ ...