理解 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:要修改或者添加的属性名称 ...
随机推荐
- AQS 支持两种同步方式?
1.独占式 2.共享式 这样方便使用者实现不同类型的同步组件,独占式如 ReentrantLock,共享式如 Semaphore,CountDownLatch,组合式的如 ReentrantReadW ...
- sleep 方法和 wait 方法有什么区别?
这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点 在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器, wait 方法会放弃这个对象的 ...
- 数据分析之Pandas操作
Pandas pandas需要导入 import pandas as pd from pandas import Series,DataFrame import numpy as np 1 Serie ...
- AutoValue —— Generated immutable value classes
本文参考 在<Effective Java>第三版第十条"Obey the general contract when overriding equals"中提到goo ...
- Unity中让Update中的方法执行一次
Unity中让Update中的方法执行一次 Unity中,很多时候,代码需要放在Update中时刻监测状态,一旦状态符合,又只需要代码执行一次:其实可以通过设置控制量的方式,让代码只执行一次:方法:设 ...
- java中 什么叫隐藏(Hide)? 最好给个例子
4.隐藏 技术核心和实例前面已经给出,这里只是给出大家对这种现象的一个定义而已,马克-to-win:子类重新定义一个与父类那里继承来的域变量完全相同的变量,称为域的隐藏.这里所谓隐藏是指子类拥有了 ...
- python pymysql连接数据库并创建表
之前看菜鸟教程 #!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost"," ...
- fetch和axios区别,摘自Stack Overflow网站答案
fetch 请求let url = 'https://someurl.com'; let options = { method: 'POST', mode: 'cors', headers: { 'A ...
- 使用pyinstaller库打包文件
1.pyinstaller的安装 先win+r打开cmd,安装具体命令如下: pip3 install pyinstaller 2.使用pyinstaller库打包文件 假设Python源文件LPR ...
- Python入门-面向对象-装饰器
1.变量作用域 全局变量和局部变量 #变量是有作用域的,分为全局变量和局部变量 num = 100 #这是全局变量 def change(): """ 查看变量作用域 & ...