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); })