13.04.2017, 14:50
|
Новичок на форуме
|
|
Регистрация: 13.04.2017
Сообщений: 6
|
|
Пометить функцию атрибутом
Привет всем!
Можно ли в JavaScript'е как-то пометить функцию, например чем-то вроде атрибута, чтобы потом можно было ее найти рефлексией?
Хочется иметь возможность в рантайме обнаруживать определенные функции. Например так
var obj = {
f1: function() { return 1; },
f2: function() { return 2; }, // Хочу найти только это функцию, а не все три
g1: function() { return 3; }
h1: 'not a function'
}
for ( var key in obj ) {
if ( obj.hasOwnProperty( key )
&& typeof( obj[key] ) == 'function'
// && ??
) {
console.log( 'Special function found: %s', key );
}
}
Спасибо.
|
|
13.04.2017, 16:10
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от Tranquill
|
Можно ли в JavaScript'е как-то пометить функцию, например чем-то вроде атрибута
|
Функция так же является объектом - значит может иметь атрибуты.
|
|
13.04.2017, 16:40
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от Tranquill
|
Можно ли в JavaScript'е как-то пометить функцию
|
Как вариант...
var obj = {
f1: function() { return 1; },
// Хочу найти только это функцию, а не все три
f2: function() { return 2; },
g1: function() { return 3; },
h1: 'not a function'
};
obj.f2.test=true;
for ( var key in obj ) {
if ( obj.hasOwnProperty( key )
&& typeof( obj[key] ) == 'function'
&& obj[key].test
) {
alert( 'Special function found: %s '+ key );
};
};
|
|
13.04.2017, 16:55
|
Новичок на форуме
|
|
Регистрация: 13.04.2017
Сообщений: 6
|
|
Сообщение от ksa
|
Как вариант...
var obj = {
f1: function() { return 1; },
// Хочу найти только это функцию, а не все три
f2: function() { return 2; },
g1: function() { return 3; },
h1: 'not a function'
};
obj.f2.test=true;
for ( var key in obj ) {
if ( obj.hasOwnProperty( key )
&& typeof( obj[key] ) == 'function'
&& obj[key].test
) {
alert( 'Special function found: %s '+ key );
};
};
|
Уже думал о таком варианте, но тут плохо то, что нет локальности.
То есть функция в одном месте объявляется, а помечается где-то в другом.
Такое трудно поддерживать будет. Может как-то по-другому можно?
|
|
13.04.2017, 18:08
|
Профессор
|
|
Регистрация: 07.11.2010
Сообщений: 301
|
|
Переменной содержащей функцию можно присвоить другую функцию, в том числе полученную из предыдущей. Собственно, так и можно менять поведение функций.
|
|
13.04.2017, 18:25
|
Новичок на форуме
|
|
Регистрация: 13.04.2017
Сообщений: 6
|
|
Сообщение от SV0L0CH
|
Переменной содержащей функцию можно присвоить другую функцию, в том числе полученную из предыдущей. Собственно, так и можно менять поведение функций.
|
Это верное утверждение, но не отвечающее на мой вопрос. Менять поведение не нужно, а требуется как-то отличать одни функции объекта от других.
|
|
13.04.2017, 18:44
|
Профессор
|
|
Регистрация: 07.11.2010
Сообщений: 301
|
|
Сообщение от Tranquill
|
требуется как-то отличать одни функции объекта от других
|
Они и отличаются друг от друга... именем... Хотя функции объектов (методы) по способу вызова отличаются от отдельных функций.
Если надо параметризировать просто функции, то можно воспользоваться параметром this, а так же стандартным набором: Function.prototype.call , Function.prtotype.apply , Function.prototype.bind
Кроме this поведение функции можно привязать к любому другому конкретному объекту, в том числе и к самой функции, как и рекомендовалось выше.
|
|
13.04.2017, 21:10
|
Новичок на форуме
|
|
Регистрация: 13.04.2017
Сообщений: 6
|
|
SV0L0CH,
Так и просится сказать "я ему про Фому, а он мне про Ерёму".
Попробую с другой стороны объяснить. Если взять, скажем, код на дотнете или на джаве, то там есть такое понятие как атрибуты. Атрибут можно создать самому, и потом любой метод класса пометить этим самым атрибутом. Далее, есть рефлексия, которая, среди прочего, позволяет программно итерировать по множеству методов класса и определять задан ли такой-то атрибут для такого-то метода. И таким образом программист имеет возможность выделить в классе подмножество методов и потом что-то с ним сделать.
Прошу обратить внимание на локальность этого процесса. Пометка атрибутом происходит точно в том месте, где метод объявляется. Это принципиально отличается от предложенного выше способа, при котором мне надо где-то отдельно в коде писать obj.myFunction.isSpecial = true; Как минимум отличается тем, что имя помеченной функции упоминается в коде дважды - в месте её определения и в месте, где ее помечают. Дублирование злейший враг сопровождаемости кода, и мне этот способ не подходит.
Если бы я готов был смириться с дублированием, то завёл бы массив с именами функций и проблемы бы не было.
Последний раз редактировалось Tranquill, 13.04.2017 в 21:27.
|
|
13.04.2017, 22:26
|
Профессор
|
|
Регистрация: 07.11.2010
Сообщений: 301
|
|
Tranquill, Если нужен синтаксический сахар, то можно разработать собственный язык с трансляцией в JavaScript. Это вполне нормально, я сам пишу на CoffeeScript.
Кроме того, для подобных нужд можно обойтись и библиотекой, хотя выглядеть это будет недостаточно наглядно и читаемо.
В нативном варианте подобных извращений не предусмотрено.
|
|
13.04.2017, 22:33
|
Новичок на форуме
|
|
Регистрация: 13.04.2017
Сообщений: 6
|
|
SV0L0CH,
Ну что не предусмотрено, то я не так уж уверен в этом. Например можно попробовать получить тело функции, посмотреть на ее первую строчку и попробовать найти в ней специальным образом отформатированный комментарий. Это конечно хак, но может будет работать. Мне достаточно чтобы работало в хроме и ие в силу специфики продукта.
Просто может я какой-то более прямой способ не замечаю.
А что за библиотеку вы имели в виду?
|
|
|
|