如何枚举 ES6 类方法[duplicate]

阅读时长 4 分钟读完

如果你正在使用ES6类来开发前端应用程序,你可能会面临一个问题,那就是如何枚举类的所有方法。在本文中,我们将讨论如何通过几种不同的方法来枚举ES6类的方法。

方式一:使用Object.getOwnPropertyNames()

我们可以使用 Object.getOwnPropertyNames() 方法来获取类的所有属性(包括方法),并将其存储在数组中。然后,我们可以遍历该数组并过滤出只是函数的方法。

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

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

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

这种方法的优点是简单易懂,容易实现。但它只能返回类的自有方法,而不能返回继承自父类或原型链上的方法。

方式二:使用Reflect.ownKeys()

另一种获取类的自有和继承方法的方法是使用 Reflect.ownKeys()。这个方法返回对象的所有键名(包括Symbol),包括非枚举属性和 Symbol 属性。

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

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

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

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

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

这种方法会枚举类的所有方法,包括继承自父类或原型链上的方法。但是要注意,它也会返回非枚举属性和 Symbol 属性。

方式三:使用Reflect.ownKeys()和Object.getOwnPropertyDescriptors()

我们可以结合使用 Reflect.ownKeys() 和 Object.getOwnPropertyDescriptors() 来获取类的所有方法,并可以获取到它们的属性描述符(例如:是否可枚举)。

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

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

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

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

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

这种方法可以枚举类的所有方法,包括继承自父类或原型链上的方法,并且可以过滤掉非可枚举方法。但是相对于前两种方法,它的实现稍微有些复杂。

总结

以上介绍了三种枚举 ES6 类方法的方法。根据你的需求不同,可以选择适合自己的方法。如果只需要枚举类的自有方法,可以使用第一种方法;如果需要枚举类的所有方法(包括继承自父类或原型链上的方法),可以使用第二种方法;如果需要枚举所有可枚举方法并获取它们的属性描述符,可以选择第三种方法。

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

纠错
反馈