在 ES7 中使用 Object.getOwnPropertyDescriptors

阅读时长 5 分钟读完

在 ES7 中使用 Object.getOwnPropertyDescriptors

Object.getOwnPropertyDescriptors是ES7(2016)引入的一个新特性,它允许我们获取一个对象中所有自身属性的描述符。在传统的方式中,Object.getOwnPropertyNames只能获取对象中所有的key,而无法获取其他属性或描述符。这是一个极大的限制,因为TMD不能理解$meta等属性。所以,ES7就引入了此特性去解决这个问题。

其语法在MDN中的定义为:

Object.getOwnPropertyDescriptors(obj)

参数:

obj:需查找属性的对象。

返回值:

一个对象,其属性的键是被查询的对象的属性名称,属性值是该属性的描述符。

下面是一个简单的示例代码:(假设我们有一个对象 o)

输出结果如下:

-- -------------------- ---- -------
-
  ----- -
    ------ ------
    --------- -----
    ----------- -----
    ------------- ----
  --
  ---- -
    ------ ---
    --------- -----
    ----------- -----
    ------------- ----
  --
  ----- -
    ------ ---- ------
    --------- -----
    ----------- -----
    ------------- ----
  -
-

这里可以看到,我们得到了每个自身属性的描述符,其中value表示属性值,writable表示属性值是否可修改,enumerable表示属性是否可枚举,configurable表示属性是否可删除。

这意味着我们可以基于这个特性做一些非常有用的操作,例如:

  1. 创建具有相同属性和描述符的新对象

通过Object.defineProperties可以把描述符赋值给新对象,达到复制对象的效果。

-- -------------------- ---- -------
----- - - -
  ----- ------
  ---- ---
  ----- ---- -----
-

----- ----------- - -----------------------------------

----- -- - --------------------------------------- -------------

----------------

输出结果为:

  1. 避免属性拷贝的问题

在拷贝一个对象时使用Object.assign可能会遇到一个问题:只能拷贝非访问器属性的值,即不能拷贝访问器属性(getter/setter)。但是,使用Object.getOwnPropertyDescriptors,可以完全拷贝一个对象,包括访问器属性。

-- -------------------- ---- -------
----- - - -
  --- ---- -- -
    ------ -----
  -
-

----- ----------- - -----------------------------------

----- -- - --------------------------------------- -------------

---------------------

输出结果为:

  1. 修改对象属性的描述符

当我们需要把某个对象属性变成只读,不可枚举或禁止删除时,快速修改属性描述符是非常方便的。

-- -------------------- ---- -------
----- - - -
  ----- ------
-

----- ----------- - -----------------------------------

------------------------ ------- -
  --------------------
  --------- -----
---

---------------------------------------------- ---------

输出结果为:

总结:

使用Object.getOwnPropertyDescriptors可以让我们更轻松地操作对象属性描述符,它是ES7引入的一个非常实用的特性。我们可以通过它完成例如复制对象、拷贝访问器属性、修改对象属性描述符等操作。同时,也可以提高代码的可读性并减少运行时的错误。

参考资料:

  1. Object.getOwnPropertyDescriptors MDN文档

  2. ECMAScript 6 中的属性及属性描述符

  3. ES6 系列之 Object.defineProperty()和 Object.getOwnPropertyDescriptors() 权限总览

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64787a8a968c7c53b04b70fa

纠错
反馈