Javascript ES6检索类的成员

时间:2016-03-15 07:52:49

标签: javascript class reflection ecmascript-6

想法是获取类的方法/属性列表。例如,我有这个类:

// foo.js
class FooController {
    constructor() {
    }
    *bar(next) {
        yield next;
        return 'meh';
    }
    //,
    meh() {
        return 'bar';
    }
}
module.exports = FooController;

现在我要检索FooController的成员。对于javascript 普通对象,这应该很容易完成,但则不能这样做:

// index.js
var Foo = require('foo');
var foo = new Foo();

// inspect
console.log(foo); // expected: { bar, meh }, but got {}

// struggle with lodash
var _ = require('lodash');    
console.log(_.keys(foo)); // expected ['bar', 'meh'], but got []

有什么想法吗?提前感谢您的任何帮助或建议。

3 个答案:

答案 0 :(得分:2)

ES6中的

class只是对ES5中函数prototype上定义方法的编码。所以对你的例子来说:

class FooController {
    constructor() {
    }
    *bar(next) {
        yield next;
        return 'meh';
    }
    //,
    meh() {
        return 'bar';
    }
}
module.exports = FooController;

ES5等价物是:

var FooController = (function() {
    function FooController() { } // This method will act as our constructor

    // All methods defined on the prototype are equivalent with the
    // so called class methods in ES6
    FooController.prototype.bar = *function(next) { yield next; return 'meh'; };

    FooController.prototype.meh = function() { return 'bar'; };

    return FooController;
})();

访问" public"关闭FooController的方法可以:

  1. 明确地访问原型:FooController.prototype

    console.log(FooController.prototype.meh()) // => 'bar'

  2. 访问构造对象的原型,如下所示:

    var foo = new FooController(); var proto = foo.__proto__; console.log(proto.meh()) // => 'bar'

  3. 当您构建foo调用new关键字时,如果还有其他关键字,则会显示以下几个步骤:

    1. 将创建一个新对象
    2. 该对象的原型将指向FooController;
    3. 的原型

      只要您将class methods视为使用prototype方法进行糖编码,就可以更容易地掌握这种情况。

      希望这有帮助。

答案 1 :(得分:1)

您应该查询prototype类实例的Foo()对象:

// index.js
var Foo = require('foo');
var foo = new Foo();

var _ = require('lodash');    
console.log(Object.getOwnPropertyNames((Object.getPrototypeOf(foo)))); // shows ['bar', 'meh', 'constructor']
// or
console.log(Object.getOwnPropertyNames(foo.__proto__)); // shows ['bar', 'meh', 'constructor']

建议的_.keys(foo)仅返回对象的所有属性(bar()meh()是继承的),实际上是空的[]

要检索所需的方法:

  • 访问实例的prototype对象
  • 枚举prototype的属性。由于所需的属性不可枚举(Object.keys()_.keys()无法工作),因此必须使用Object.getOwnPropertyNames()

详细了解Object.getPrototypeOf()Object.getOwnPropertyNames() 有关完整示例,请参阅this fiddle

答案 2 :(得分:0)

选项1:您可以打印class constructor,它会给出所需的结果:

class FooController {
    constructor() {
    }
    *bar(next) {
        yield next;
        return 'meh';
    }
    meh() {
        return 'bar';
    }
}


var foo = new FooController();

console.log(foo.constructor);

function class FooController {
    constructor() {
    }
    *bar(next) {
        yield next;
        return 'meh';
    }
    meh() {
        return 'bar';
    }
}

选项2:您可以打印class object而不绑定它:

class FooController {
    constructor() {
    }
    *bar(next) {
        yield next;
        return 'meh';
    }
    meh() {
        return 'bar';
    }
}

console.log(FooController);

function class FooController {
    constructor() {
    }
    *bar(next) {
        yield next;
        return 'meh';
    }
    meh() {
        return 'bar';
    }
}