2016-06-12 61 views
3

因此随着JavaScript框架的不断发展,许多人采用了ECMAScript 6垫片或TypeScript,使得新功能更加接近。我的问题是这样的:迭代通过ES6类的方法和属性

如何迭代ES6类的方法/属性?

例如(使用对象)

var obj = { 
    prop: 'this is a property', 
    something: 256, 
    method: function() { console.log('you have invoked a method'); } 
} 

for (var key in obj) { 
    console.log(key); 
} 

// => 'prop' 
// => 'something' 
// => 'method' 

(带班)

class MyClass { 
    constructor() { 
    this.prop = 'prop'; 
    this.something = 256; 
    } 

    method() { 
    console.log('you have invoked a method'); 
    } 
} 

如何列出的方法MyClass有,和可选的特性呢?

回答

9

constructor和任何定义的方法是的不可枚举属性类的prototype对象。

因此你可以得到的名称数组(不含建设类的实例)与:

Object.getOwnPropertyNames(MyClass.prototype) 

你不能没有创建一个实例获得的属性,但如此做,你可以使用Object.keys函数仅返回一个对象的枚举的属性:

Object.keys(myInstance) 

AFAIK有获得既从原型非枚举的属性和实例的枚举的属性一起没有标准的方式。

+1

太棒了 - 正是我在找的东西!谢谢 :) –

-1

我还没有测试过,我仍然认为有2种方法可以做到这一点。 第一个是返回'this'环境并循环它。 第二个与Javascript的对象相同。 示例第一之一: - (未测试)

class MyClass { 
    constructor() { 
    this.prop = 'prop'; 
    this.something = 256; 
    } 

    method() { 
    console.log('you have invoked a method'); 
    } 
    get getthis() 
    { 
    return this; 
    } 
} 

for(var key in MyClass.getthis) 
{ 
    console.log(key); 
} 

这是:-(未测试的第二种方法)

class MyClass { 
    constructor() { 
    this.prop = 'prop'; 
    this.something = 256; 
    } 

    method() { 
    console.log('you have invoked a method'); 
    } 

} 

for(var key in MyClass) 
{ 
    console.log(key); 
} 
+0

是的,我已经尝试了你的第二种方法,这是行不通的。第一个,直到你实例化一个新的类'var myclass = new MyClass()'的实例才会工作。甚至在那之后,它只返回属性,而不是类中的方法 - 这正是我正在寻找的... –

+0

也许我们可以在类中做一个循环并将它作为一个对象返回?你也尝试过吗? – KAKAN