ES6迭代类方法

鉴于这个class级; 我将如何遍历它包含的方法?

class Animal { constructor(type){ this.animalType = type; } getAnimalType(){ console.log('this.animalType: ', this.animalType ); } } let cat = window.cat = new Animal('cat') 

我所尝试的是以下没有成功:

 for (var each in Object.getPrototypeOf(cat) ){ console.log(each); } 

你可以在原型上使用Object.getOwnPropertyNames :

 Object.getOwnPropertyNames( Animal.prototype ) // [ 'constructor', 'getAnimalType' ] 

检查这个小提琴

https://jsfiddle.net/ponmudi/tqmya6ok/1/

 class Animal { constructor(type){ this.animalType = type; } getAnimalType(){ console.log('this.animalType: ', this.animalType ); } } let cat = new Animal('cat'); //by instance document.getElementById('1').innerHTML = Object.getOwnPropertyNames(cat); //by getting prototype from instance document.getElementById('2').innerHTML = Object.getOwnPropertyNames(Object.getPrototypeOf(cat)); //by prototype document.getElementById('3').innerHTML = Object.getOwnPropertyNames(Animal.prototype); 

如果您还需要获取超类方法,则可以重复调用Object.getPrototypeOf() ,直到find全部。 当你到达Object.prototype时,你可能会想停下来,因为那里的方法是基础的,你通常不想用任何使用reflection的代码来触碰它们。

Get类(方法)的问题有一个答案,其中包括一个函数来做到这一点,但它有一些缺点(包括使用循环条件有一个副作用修改函数参数,这让我有两个问题代码风格的select在一行代码…),所以我已经在这里重写它:

 export function listMethodNames (object, downToClass = Object) { // based on code by Muhammad Umer, https://stackoverflow.com/a/31055217/441899 let props = []; for (let obj = object; obj !== null && obj !== downToClass.prototype; obj = Object.getPrototypeOf(obj)) { props = props.concat(Object.getOwnPropertyNames(obj)); } return props.sort().filter((e, i, arr) => e != arr[i+1] && typeof object[e] == 'function'); } 

除了修复原始代码中的错误(它不会将对象复制到循环的另一个variables中,所以在返回行中用于过滤的时间已经不再有效),这给出了一个可选的参数停止在一个可configuration的类的迭代。 它将默认为Object (所以Object的方法被排除在外;如果你想包含它们,你可以使用一个没有出现在inheritance链中的类…也许可以使一个标记类例如class IncludeObjectMethods{}感)。 我也将do循环改为更清晰for循环,并将旧式function ... filter函数重写为ES6箭头函数,以使代码更紧凑。

由于ES6类中的方法是不可枚举的,因此除了使用Object.getOwnPropertyNames()来获取其所有属性的数组外,没有别的select。

达到这个之后,有几种方法可以去解压缩方​​法,最简单的方法可能是使用Array.prototype.forEach() 。

看看下面的代码片段:

 Object.getOwnPropertyNames(Animal.prototype).forEach(function(value) { console.log(value); })