Как я могу различать эти вещи в ES6?
- стрелками функции являются функциями, которые не могут быть использованы в качестве конструкторов, и не имеют
.prototype
собственности. Однако методы тоже не существуют. Они наследуют от Function.prototype
.
- классы - это функции, которые нельзя вызвать без
new
, и которые имеют объект .prototype
, который обычно не пуст. Если использовалось ключевое слово extends
, они не наследуются от Function.prototype
.
- функции - это функции, которые можно назвать в любом случае, и имеют
.prototype
, то есть normally empty. Они наследуют от Function.prototype
.
- функция генератора являются функциями, которые делают имеют
.prototype
, который наследуется от внутреннего GeneratorPrototype объекта, и они наследуют от собственного объекта Генератора.
Как вы можете видеть, есть некоторые подсказки. Однако свойства и наследование всегда могут быть запутаны, поэтому вы не можете доверять ему. Является ли функция конструктором (может быть вызвана с new
) не может быть определена извне, вы должны вызвать ее и посмотреть, будет ли она бросать - что тоже можно было бы подделать.
Итак, ваш лучший выбор может быть Function.prototype.toString
, чтобы посмотреть, как выглядит источник. Если ваша реализация ES поддерживает это.
И как я могу различать эти вещи в транспилерах?
Я не думаю, что какой-либо транспилер не использует стрелки и методы прототипа. Создается ли конструктор классов при вызове, зависит от слабости транспиляции, но в любом случае это не очень хороший способ разграничения.
toString
не работает ни afaik.
Какая у вас просьба? Я бы попытался вызвать func.toString() и посмотреть, что я получаю и, возможно, проанализировать. – Bnaya
Я бы настоятельно рекомендовал, чтобы имена классов соответствовали давней традиции конструкторов, имеющих первую букву в верхнем регистре. Таким образом, с первого взгляда легко понять, что 'Function()' является либо классом, либо конструктором, а 'function()' является функцией. – slebetman