Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.04.2017, 14:50
Новичок на форуме
Отправить личное сообщение для Tranquill Посмотреть профиль Найти все сообщения от Tranquill
 
Регистрация: 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 );
  }
}


Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 13.04.2017, 16:10
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от Tranquill
Можно ли в JavaScript'е как-то пометить функцию, например чем-то вроде атрибута
Функция так же является объектом - значит может иметь атрибуты.
Ответить с цитированием
  #3 (permalink)  
Старый 13.04.2017, 16:40
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от 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 );
	};
};
Ответить с цитированием
  #4 (permalink)  
Старый 13.04.2017, 16:55
Новичок на форуме
Отправить личное сообщение для Tranquill Посмотреть профиль Найти все сообщения от Tranquill
 
Регистрация: 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 );
	};
};
Уже думал о таком варианте, но тут плохо то, что нет локальности.
То есть функция в одном месте объявляется, а помечается где-то в другом.
Такое трудно поддерживать будет. Может как-то по-другому можно?
Ответить с цитированием
  #5 (permalink)  
Старый 13.04.2017, 18:08
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Переменной содержащей функцию можно присвоить другую функцию, в том числе полученную из предыдущей. Собственно, так и можно менять поведение функций.
Ответить с цитированием
  #6 (permalink)  
Старый 13.04.2017, 18:25
Новичок на форуме
Отправить личное сообщение для Tranquill Посмотреть профиль Найти все сообщения от Tranquill
 
Регистрация: 13.04.2017
Сообщений: 6

Сообщение от SV0L0CH Посмотреть сообщение
Переменной содержащей функцию можно присвоить другую функцию, в том числе полученную из предыдущей. Собственно, так и можно менять поведение функций.
Это верное утверждение, но не отвечающее на мой вопрос. Менять поведение не нужно, а требуется как-то отличать одни функции объекта от других.
Ответить с цитированием
  #7 (permalink)  
Старый 13.04.2017, 18:44
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Сообщение от Tranquill
требуется как-то отличать одни функции объекта от других
Они и отличаются друг от друга... именем... Хотя функции объектов (методы) по способу вызова отличаются от отдельных функций.
Если надо параметризировать просто функции, то можно воспользоваться параметром this, а так же стандартным набором: Function.prototype.call , Function.prtotype.apply , Function.prototype.bind
Кроме this поведение функции можно привязать к любому другому конкретному объекту, в том числе и к самой функции, как и рекомендовалось выше.
Ответить с цитированием
  #8 (permalink)  
Старый 13.04.2017, 21:10
Новичок на форуме
Отправить личное сообщение для Tranquill Посмотреть профиль Найти все сообщения от Tranquill
 
Регистрация: 13.04.2017
Сообщений: 6

SV0L0CH,
Так и просится сказать "я ему про Фому, а он мне про Ерёму".

Попробую с другой стороны объяснить. Если взять, скажем, код на дотнете или на джаве, то там есть такое понятие как атрибуты. Атрибут можно создать самому, и потом любой метод класса пометить этим самым атрибутом. Далее, есть рефлексия, которая, среди прочего, позволяет программно итерировать по множеству методов класса и определять задан ли такой-то атрибут для такого-то метода. И таким образом программист имеет возможность выделить в классе подмножество методов и потом что-то с ним сделать.
Прошу обратить внимание на локальность этого процесса. Пометка атрибутом происходит точно в том месте, где метод объявляется. Это принципиально отличается от предложенного выше способа, при котором мне надо где-то отдельно в коде писать obj.myFunction.isSpecial = true; Как минимум отличается тем, что имя помеченной функции упоминается в коде дважды - в месте её определения и в месте, где ее помечают. Дублирование злейший враг сопровождаемости кода, и мне этот способ не подходит.

Если бы я готов был смириться с дублированием, то завёл бы массив с именами функций и проблемы бы не было.

Последний раз редактировалось Tranquill, 13.04.2017 в 21:27.
Ответить с цитированием
  #9 (permalink)  
Старый 13.04.2017, 22:26
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Tranquill, Если нужен синтаксический сахар, то можно разработать собственный язык с трансляцией в JavaScript. Это вполне нормально, я сам пишу на CoffeeScript.
Кроме того, для подобных нужд можно обойтись и библиотекой, хотя выглядеть это будет недостаточно наглядно и читаемо.
В нативном варианте подобных извращений не предусмотрено.
Ответить с цитированием
  #10 (permalink)  
Старый 13.04.2017, 22:33
Новичок на форуме
Отправить личное сообщение для Tranquill Посмотреть профиль Найти все сообщения от Tranquill
 
Регистрация: 13.04.2017
Сообщений: 6

SV0L0CH,
Ну что не предусмотрено, то я не так уж уверен в этом. Например можно попробовать получить тело функции, посмотреть на ее первую строчку и попробовать найти в ней специальным образом отформатированный комментарий. Это конечно хак, но может будет работать. Мне достаточно чтобы работало в хроме и ие в силу специфики продукта.
Просто может я какой-то более прямой способ не замечаю.

А что за библиотеку вы имели в виду?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расширение для Safari. Как вызвать функцию из popover в global page? housewm Opera, Safari и др. 0 21.12.2013 06:07
передать анонимную функцию, вызывающую другую функцию с нужными параметрами Ваяс Общие вопросы Javascript 5 21.02.2013 20:12
Выполнить функцию заранее неизвестную Neokortex jQuery 2 13.02.2012 12:41
checkbox включен запускаем одну функцию выключен другую Sadist_dead Элементы интерфейса 11 27.09.2011 10:46
проблема с передачей параметров в функцию bartonom Элементы интерфейса 4 19.09.2011 12:41