4

如何在 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?

4

2 回答 2

7

我如何在 ES6 中区分这些东西?

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

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

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

我如何区分转译器中的这些东西?

我不认为任何转译器都实现了无原型的箭头和方法。类构造函数是否在被调用时抛出取决于转换的松散程度,但这无论如何都不是区分的好方法。
toString也不起作用。

于 2015-08-11T16:53:20.430 回答
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;
}

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

于 2015-08-11T08:55:43.133 回答