2015-03-31 2 views
1

Я хотел бы проверить, является ли функция конструктором (предназначен для вызова с 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; 
} 
  • ли это приличная приближение?
  • Есть ли еще что я могу проверить?
  • Какие недостатки/ложные срабатывания существуют для этого подхода?

Примечание: Это вопрос любопытства, а не требование. Пожалуйста, не говорите «это плохой единичный тест» или «это действительно стоит?». Это просто забавное упражнение, чтобы увидеть, что возможно (хотя и плохо/необоснованно/не должно быть использовано).

+1

Любая функция в JavaScript * может * быть конструктором. Невозможно сказать. Проверка прототипа может вызвать множество ложных негативов. – Pointy

+0

@Pointy Каковы эти недостатки? Я не спрашиваю _yes_ или _no_, я спрашиваю _how_ или _why not_. Я ожидаю, что нет никакого способа сделать это, но мой вопрос - это то, что является самым близким способом сделать это, если таковое имеется. Если это действительно не так, создайте ответ вместо комментария и объясните, почему. – JimmyBoh

+0

Ну, это зависит; если вы в порядке со своим кодом, говорящим вам, что некоторое количество функций, которые фактически используются в качестве конструкторов, являются конструкторами * not *, а значит, для этого. – Pointy

ответ

1

Это невозможно, потому что любая функция в Javascript может быть конструктором. Вы можете вызвать любую функцию, предваренную new, чтобы ее this указывали на новый объект, как и вы можете .call любую функцию, чтобы ее this указывала на все, что вы хотите.

Смежные вопросы