理解 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

上过小学二年的同学都能看懂这段英文,说的是

  1. 我们在 obj1 上定义一个 property(可以理解是一个属性或者元素);
  2. 这个 property 的名字叫做 property1
  3. property1 的值为 42
  4. 她不可以被改写。

因此我们访问 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 个属性,可以分为两大类:数据描述符存取描述符

很容易猜到,getset 就是存取描述符,其他的 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的更多相关文章

  1. 理解Object.defineProperty()

    理解Object.defineProperty() Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 基本语法:Obj ...

  2. 深入理解 Object.defineProperty 及实现数据双向绑定

    Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...

  3. 理解Object.defineProperty函数中的get与set

    defineProperty是什么: 该函数可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象.通俗理解就是: 给对象添加一个新的属性,或者针对对象里的某些属性,可以给这 ...

  4. 理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  5. [转] 理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  6. 《转》理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  7. 简单的理解 Object.defineProperty()

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

  8. vue之Object.defineProperty()

    了解Object.defineProerty()方法 关于Object.defineProperty()方法的解释,理解Object.defineProperty的作用 这篇文章做了很详细的概述 关于 ...

  9. 浅谈兔兔对Object.defineProperty的理解

    给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参数1:目标对象 参数2:要修改或者添加的属性名称 ...

随机推荐

  1. Netty学习摘记 —— 心跳机制 / 基于分隔符和长度的协议

    本文参考 本篇文章是对<Netty In Action>一书第十一章"预置的ChannelHandler和编解码器"的学习摘记,主要内容为通过 SSL/TLS 保护 N ...

  2. jupyter notebook使用技巧

    shift + tab 键可以查看对应源代码(注意:需要先将代码运行才能查看) Jupyter Notebook 的快捷键 Jupyter Notebook 有两种键盘输入模式:1.命令模式,键盘输入 ...

  3. CSS自定义属性 —— 别说你懂CSS相对单位

    前段时间试译了Keith J.Grant的CSS好书<CSS in Depth>,其中的第二章<Working with relative units>,书中对relative ...

  4. 「腾讯视频」微信小程序插件介绍

    上期,我们在<从原理到应用,一文带你了解小程序插件能力>一文中介绍了小程序插件的意义.作用以及应用.今天开始,我们会每期与大家分享一款优秀的小程序插件,从使用场景到使用方法,都将作出详细的 ...

  5. 报错需要选择一个空目录,或者选择的非空目录下存在 app.json 或者 project.config.json解决方案

    前言 小程序的第一个坑就是,创建了一个小程序项目,却在微信web开发者工具无法打开... 报了个错:需要选择一个空目录,或者选择的非空目录下存在 app.json 或者 project.config. ...

  6. msmpeng.exe阻止移动硬盘弹出

    MsMpEng.exe 占用 该进程是微软反恶意软件服务的一个可执行文件,用户无法手动停止该进程. 首先运行   eventvwr.msc打开事件查看器,找到警告信息,查看是什么进程在阻止硬盘弹出. ...

  7. 【MarkDown】使用

    1. 插入代码 在代码前后加上三个点样式的标识符: ``` 效果: 我是代码 1-1 换行 &符号加上 "ensp;"   2. 标题样式定制 # 一级标题 ## 二级标题 ...

  8. js判断是否为电话号码

    /* 用途:检查输入字符串是否符合国内固话或者传真格式 输入: s:字符串  格式例如:030-4557777返回: 如果通过验证返回true,否则返回false */ function isTel( ...

  9. CommonsCollection4反序列化链学习

    CommonsCollection4 1.前置知识 由于cc4没有新的知识点,主要是用cc2,然后稍微cc3结合了,所以我们可以看ysoserial源码,自己尝试构造一下,把cc2通过获取Invoke ...

  10. 设计模式学习笔记(十四)责任链模式实现以及在Filter中的应用

    责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求.当有请求发生时,可将请求沿着这条 ...