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

时间:2015-08-11 08:29:54

标签: 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; }

示例:

test(x) //=> 'arrow'
test(y) //=> 'class'
test(z) //=> 'function'

我如何在转录器中区分这些东西 - Traceur / Babel?

2 个答案:

答案 0 :(得分:7)

  

如何区分ES6中的这些内容?

  • 箭头函数是不能用作构造函数的函数,并且不具有.prototype属性。但是,方法也不是。他们继承自Function.prototype
  • 类是不能在没有new的情况下调用的函数,并且具有通常不为空的.prototype对象。如果使用了extends关键字,则他们不会继承Function.prototype
  • 函数是可以以任一方式调用的函数,并且.prototype具有normally empty。他们继承自Function.prototype
  • 生成器函数是具有.prototype的函数,它继承自内部 GeneratorPrototype 对象,并且它们继承自内部 Generator 对象。

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

所以你最好的选择可能是Function.prototype.toString,看看来源是怎样的。如果您的ES实现支持。

  

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

我认为任何转换器都不会实现没有原型的箭头和方法。类构造函数是否会被调用取决于转换的松散程度,但这无论如何都不是区分的好方法。
toString afaik无法正常工作。

答案 1 :(得分:1)

你不能将前两个案例转化为这个:

var x = function x(i) {
  return i + 1;
};

function z(i) {
  return i + 1;
}

对于最后一个,你可以在你打电话时检查它是否是一个类:

function isClass(instance){
  try{
    instance()
  }catch(e){
    return e.message === "Cannot call a class as a function";
  }
  return false;
}

但这显然会触发调用它的副作用,所以它在一般情况下不起作用。