Возможно ли присвоить тип / класс функциям JavaScript?

#javascript #reflection

#javascript #отражение

Вопрос:

Интересно, возможно ли присвоить тип / класс функциям JavaScript.

Конечно, класс объекта / тип функции — это ‘Функция / function’.

http://bonsaiden.github.io/JavaScript-Garden/#types.typeof

Однако в моем проекте я каким-то образом хочу определить класс для функции, чтобы сгруппировать их.

Это аналогичная концепция класса элементов HTML / CSS DOM.

У меня есть функция, аргументы которой являются функцией, и я хочу определить, какая type или class из функций передается функции.

Он не работает ни с каким методом объекта, просто с функцией, но его можно отличить как obj.hasOwnProperty('someClass') .

Мне просто интересно, есть ли разумный способ, если вы считаете невозможным, пожалуйста, настаивайте на этом.

Спасибо.

PS. Я не понимаю, почему кто-то голосует -1 и закрывает этот вопрос.

Это вопрос reflection Javascript. Это нормально, если найти некоторый коэффициент отражения JS ограничен. и я думаю, что неразумно избегать объяснения того, что что-то невозможно на определенном языке.

Комментарии:

1. Тип функции — «function», и все функции имеют тот же тип. Существует не несколько типов функций, поэтому неясно, что именно вы пытаетесь сделать. Пожалуйста, покажите пример двух разных функций, которые вы хотите различать? К вашему сведению, функции — это объекты, поэтому у них могут быть ваши собственные пользовательские свойства, поэтому вы можете создать свое собственное пользовательское свойство, которое определяет тип вашей функции, но все еще неясно, какую проблему вы действительно пытаетесь решить.

2. Спасибо, я это знаю, и на самом деле я иллюстрирую этот факт в своем вопросе. Что я пытаюсь сделать, так это add добавить к функциям некоторый дополнительный фактор класса. Это для общего подхода, а не для конкретных двух разных функций, которые я хочу различать.

3. > К вашему сведению, функции — это объекты, поэтому у них могут быть ваши собственные пользовательские свойства, чтобы вы могли создать свое собственное пользовательское свойство. < Отлично. Это ответ. Вы успешно поняли мой вопрос и даете конкретный ответ. Если вы опубликуете это, я соглашусь.

Ответ №1:

Функция — это объект. Вы можете добавить свои собственные пользовательские свойства к любой функции. Итак, если вы хотите установить свой собственный тип для нескольких разных функций, чтобы вы могли протестировать это, вы можете просто добавить одно и то же пользовательское свойство (с присвоенными ему разными значениями) к каждой из этих функций.

 function myFunc1() {}
myFunc1.myType = "whatever1";

function myFunc2() {}
myFunc2.myType = "whatever2";

function myFunc3() {}
myFunc3.myType = "whatever3";

function callMe(cb) {
    if (cb.myType === "whatever1") {
        // code here
    } else if (...) {
        // code here
    }
}

callMe(myFunc1);
  

Обратите внимание, это немного необычно, и если вы объяснили реальную проблему, которую пытались решить, вероятно, существует более распространенный шаблон проектирования, который мог бы вам помочь.

Комментарии:

1. Спасибо. Отлично. Принято. и нет, это достаточный шаблон проектирования, который мне точно нужен.

2. хорошее решение. для согласованности (каждая функция имеет определенный тип) Функция может быть прототипирована раньше, чем Function.prototype.MyType = ‘default’;

3. Прототипирование — тоже хорошая идея. Я бы сделал Function.prototype.class = null;

4. @KenOKABE — Я не уверен, что добавление его в прототип необходимо. Вы можете легко проверить, установлено ли оно или нет, просто проверив, не установлено ли оно, undefined что, вероятно, работает так же хорошо, как если бы вы ранее инициализировали его null через прототип и теперь присвоили каждой отдельной функции свойство, которого у нее раньше не было. Я лично ограничил бы эффект вашего изменения только теми местами, где вам это нужно, а не менял бы каждую отдельную функцию. Как я уже говорил ранее, если бы мы знали, какую проблему вы действительно пытаетесь решить, мы могли бы также, вероятно, рекомендовать более распространенный шаблон проектирования.

5. Правильно, после публикации я заметил, что прототипирование ‘null’ имеет меньшее значение.

Ответ №2:

@jfriend00 предложил ответ.

К вашему сведению, функции — это объекты, поэтому у них могут быть ваши собственные пользовательские свойства, чтобы вы могли создать свое собственное пользовательское свойство.

Он прав, поэтому, чтобы добавить класс / свойство к любым функциям, просто сделайте

 var myFunction = function(foo){...};
myFunction['someClass'] = true;

//To distinguish

if (someFunction.hasOwnProperty('someClass'))
      {
        console.log('someFunction is someClass'); 
      }