如何区分箭头函数,类和正常函数?

Boo*_*jaa 4 javascript ecmascript-6 arrow-functions

如何使用它的参考来区分ES6中的这三个东西?

let x = i => i+1;

class y { constructor(i) { this._i=i+1; } get i(){ return this._i;} }

function z(i) { return i+1; }
Run Code Online (Sandbox Code Playgroud)

例:

test(x) //=> 'arrow'
test(y) //=> 'class'
test(z) //=> 'function'
Run Code Online (Sandbox Code Playgroud)

我怎样才能在转录器中区分这些东西 - Traceur/Babel?

Ber*_*rgi 7

如何区分ES6中的这些东西?

  • 箭头函数是不能用作构造函数的函数,并且没有.prototype属性.但是,方法也没有.他们继承自己Function.prototype.
  • 类是无法调用的函数new,并且具有.prototype通常不为空的对象.如果使用extends关键字,则不会继承关键字Function.prototype.
  • 函数是可以调用任何一种方式的功能,确实有.prototype就是通常是空的.他们继承自己Function.prototype.
  • 生成器函数是具有.prototype继承自内部GeneratorPrototype对象的函数,并且它们从内部Generator对象继承.

如你所见,有一些线索.但是,属性和继承总是可以搞乱,所以你不能真正信任它.函数是否是构造函数(可以调用new)无法从外部确定,您必须调用它并查看它是否抛出 - 这也可能是伪造的.

所以你最好的选择是Function.prototype.toString看看源的外观.如果您的ES实现支持.

我怎样才能在转录器中区分这些东西?

我认为任何转换器都不会实现没有原型的箭头和方法.类构造函数是否会被调用取决于转换的松散程度,但这并不是一种区分的好方法.
toString不起作用.