想法是获取类的方法/属性列表。例如,我有这个类:
// 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 []
有什么想法吗?提前感谢您的任何帮助或建议。
答案 0 :(得分:2)
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
的方法可以:
明确地访问原型:FooController.prototype
console.log(FooController.prototype.meh()) // => 'bar'
访问构造对象的原型,如下所示:
var foo = new FooController();
var proto = foo.__proto__;
console.log(proto.meh()) // => 'bar'
当您构建foo
调用new
关键字时,如果还有其他关键字,则会显示以下几个步骤:
FooController
; 只要您将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';
}
}