有可能获得非可枚举继承一个对象属性的名字吗?

在 JavaScript 中,属性的可枚举性是一个重要的概念。一个属性可以被定义为可枚举或不可枚举,这决定了它是否会出现在对象的迭代器中。通常情况下,我们可以使用 Object.keys()for-in 循环来获取一个对象所有的可枚举属性。但是,如果一个属性是不可枚举的,并且是从父级对象继承而来的,那么该属性的名字是无法直接获取的。本文将探讨如何解决这个问题。

如何判断属性是否可枚举

首先,我们需要知道如何判断一个属性是否可枚举。在 ES5 中,可以使用 Object.getOwnPropertyDescriptor() 方法获取一个对象属性的描述符,并检查其中的 enumerable 属性。示例代码如下:

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

ES6 引入了一个更加简洁的语法 —— 对象属性的简洁表示法,这种方法定义的属性默认是可枚举的。

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

如何获取不可枚举的属性名

如果一个属性是从父级对象继承而来,并且不可枚举,那么我们无法直接通过 Object.keys()for-in 循环获取它的名字。但是,我们可以使用一些工具方法来解决这个问题。

Object.getOwnPropertyNames()

Object.getOwnPropertyNames() 方法返回一个对象自身的所有属性名,包括不可枚举的属性。示例代码如下:

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

但是,Object.getOwnPropertyNames() 只返回自身的属性名,不能获取继承而来的属性名。

Reflect.ownKeys()

Reflect.ownKeys() 方法返回一个对象自身和继承的所有属性名,包括不可枚举的属性。示例代码如下:

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

注意,Reflect.ownKeys() 返回的数组中包含了 __proto__ 属性,这是因为该方法获取的是自身和继承的所有属性名。

如何遍历所有属性名

如果我们想要获取一个对象所有的属性名,包括自身和继承的、可枚举和不可枚举的,可以使用以下方法:

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

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

该方法使用了循环逐级获取父级原型链上的属性名,并将它们合并到一个数组中。

结论

在 JavaScript 中,如果一个属性是从

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/11987