Я хотел бы проверить, является ли функция конструктором (предназначен для вызова с new
) или просто регулярной функцией, которую нужно называть буквально.Можно ли проверить, является ли функция javascript конструктором?
Это очень хорошо, возможно, невозможно, я ничего не мог найти по этому поводу, но хотел посмотреть, возможно ли это просто для этого вида спорта.
Вот основная проверка того, что у меня до сих пор:
function isConstructor(func) {
// Ensure it is a function...
if (typeof func !== 'function') {
return false;
}
// Check for at least one custom property attached to the prototype
for (var prop in func.prototype) {
if (func.prototype.hasOwnProperty(prop)) {
return true;
}
}
// No properties were found, so must not be a constructor.
return false;
}
- ли это приличная приближение?
- Есть ли еще что я могу проверить?
- Какие недостатки/ложные срабатывания существуют для этого подхода?
Примечание: Это вопрос любопытства, а не требование. Пожалуйста, не говорите «это плохой единичный тест» или «это действительно стоит?». Это просто забавное упражнение, чтобы увидеть, что возможно (хотя и плохо/необоснованно/не должно быть использовано).
Любая функция в JavaScript * может * быть конструктором. Невозможно сказать. Проверка прототипа может вызвать множество ложных негативов. – Pointy
@Pointy Каковы эти недостатки? Я не спрашиваю _yes_ или _no_, я спрашиваю _how_ или _why not_. Я ожидаю, что нет никакого способа сделать это, но мой вопрос - это то, что является самым близким способом сделать это, если таковое имеется. Если это действительно не так, создайте ответ вместо комментария и объясните, почему. – JimmyBoh
Ну, это зависит; если вы в порядке со своим кодом, говорящим вам, что некоторое количество функций, которые фактически используются в качестве конструкторов, являются конструкторами * not *, а значит, для этого. – Pointy