Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2013, 20:09
Аватар для ExeiL
Интересующийся
Отправить личное сообщение для ExeiL Посмотреть профиль Найти все сообщения от ExeiL
 
Регистрация: 04.12.2009
Сообщений: 13

Добавление индивидуальных свойств к функции
Всем привет,

Есть функция, которая делает элемент прозрачным (плавно). Соответственно хочу добавить ей свойство "в работе". И чтобы каждый экземпляр вызванной функции имел это свойство для проверки.

function fade(arg1,arg2,arg3) {
...
}

function initFade() {
  var fd1 = fade,
       fd2 = fade;

  fd1(arg1,arg2,arg3);
  alert(fd1.running + " " + fd2.running); // true false
}

initFade();


В общем как-то так, надеюсь логику работы поняли и сможете мне подсказать как правильно реализовать данный замысел...
Ответить с цитированием
  #2 (permalink)  
Старый 22.08.2013, 20:24
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от ExeiL
Есть функция
...
хочу добавить ей свойство "в работе".
У функции нет свойств...

Сообщение от ExeiL
каждый экземпляр вызванной функции
У функций нет экземпляров...
Ответить с цитированием
  #3 (permalink)  
Старый 22.08.2013, 20:55
Аватар для ExeiL
Интересующийся
Отправить личное сообщение для ExeiL Посмотреть профиль Найти все сообщения от ExeiL
 
Регистрация: 04.12.2009
Сообщений: 13

Сообщение от ksa Посмотреть сообщение
У функции нет свойств...
function fn() {
  fn.prop = "свойств";
}
fn.propNew = "текст из ";
fn();
alert(fn.propNew + fn.prop);  // текст из свойств


Сообщение от ksa Посмотреть сообщение
У функций нет экземпляров...
function makeCounter() {
  var currentCount = 0;
    
  return function() {
    currentCount++;
    return currentCount;
  };
}

var counter = makeCounter();

// каждый вызов увеличивает счётчик
counter(); 
counter(); 
alert( counter() ); // 3

var c1 = makeCounter();

var c2 = makeCounter();

alert( c1() ); // 1
alert( c2() ); // 1, счётчики независимы


Похоже, что все есть...

Возможно, вы знаете способ проверки на работу функции получше, чем придумал я?

Последний раз редактировалось ExeiL, 22.08.2013 в 21:03.
Ответить с цитированием
  #4 (permalink)  
Старый 22.08.2013, 21:36
Аватар для ExeiL
Интересующийся
Отправить личное сообщение для ExeiL Посмотреть профиль Найти все сообщения от ExeiL
 
Регистрация: 04.12.2009
Сообщений: 13

Сообщение от Дзен-трансгуманист Посмотреть сообщение
Ну так fd1 = fade и fd2 = fade - это просто две ссылки на один объект, то есть экземпляр при обращении к каждой переменной один и тот же. Делайте через возврат замыкания, как со счетчиком: fd1 = makeFader().
Дак да, это понятно. Просто непонятно как связать со свойствами...
Сделал уже через замыкание, но вдруг кто знает как связать со свойствами или еще более лучшее решение...
Ответить с цитированием
  #5 (permalink)  
Старый 22.08.2013, 22:56
Аватар для ExeiL
Интересующийся
Отправить личное сообщение для ExeiL Посмотреть профиль Найти все сообщения от ExeiL
 
Регистрация: 04.12.2009
Сообщений: 13

Сообщение от Дзен-трансгуманист Посмотреть сообщение
function makeFader() {

  function fade (arg1,arg2,arg3) {
    fade.running = true;
  }

  fade.running = false;
  return fade;
}
о, точно. Спасибо!
Теперь не придется лишний раз выполнять функцию для возврата переменной.
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2013, 08:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от ExeiL
Похоже, что все есть...
Экземпляров точно нет...
Это только копирование ссылки на объект.

Да и свойства те, не свойства функции... Это свойства объекта ссылка на который хранится в той же переменной, что и на функцию.
Ответить с цитированием
  #7 (permalink)  
Старый 23.08.2013, 08:52
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Хотя из первоисточника
Цитата:
В javascript функции являются полноценными объектами встроенного класса Function. Именно поэтому их можно присваивать переменным, передавать и, конечно, у них есть свойства
http://javascript.ru/basic/functions#funkcii---obekty

Т.ч. свойства есть.

Но экземпляры делает только new или нечто аналогичное...
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2013, 09:18
Аватар для ExeiL
Интересующийся
Отправить личное сообщение для ExeiL Посмотреть профиль Найти все сообщения от ExeiL
 
Регистрация: 04.12.2009
Сообщений: 13

Сообщение от ksa Посмотреть сообщение
Хотя из первоисточника

http://javascript.ru/basic/functions#funkcii---obekty

Т.ч. свойства есть.

Но экземпляры делает только new или нечто аналогичное...
Кстати, не понятно как лучше: делать объект с функциями и потом использовать new или делать функции с замыканием - как выше... по сути выполняться будет someFunction.someMethod() и там и там...

function SomeFn() {
  this.someMethod = function() {
    alert("hi");
  };
}

var someFunction = new SomeFn;
someFunction.someMethod();


или

function someFn() {
  function sfn() {
    return;
  }

  sfn.someMethod = function() {
    alert("hi");
  }

  return sfn;
}

var someFunction = someFn();
someFunction.someMethod();
Ответить с цитированием
  #9 (permalink)  
Старый 23.08.2013, 09:26
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от ExeiL
как лучше
Это наверное больше философский вопрос...

Что есть "лучше"?
Например есть несколько вариантов реализации нужного тебе эффекта... Какой лучше?
- работает быстрее?
- текст реализации выглядит понятнее, симпатичнее?
- менее ресурсоемок?
Ответить с цитированием
  #10 (permalink)  
Старый 23.08.2013, 09:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от ExeiL
someFunction = someFn()
По мне так это масло масляное...
1 объект/экземпляр и две переменные со ссылкой на него...

Сообщение от ExeiL
var someFunction = new SomeFn;
А тут четко создается объект/экземпляр класса SomeFn.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Специфические функции и свойства различных браузеров onejsquestion Javascript под браузер 3 28.06.2010 10:54
Добавление метода к функции YISHIMITSY Общие вопросы Javascript 2 17.02.2010 12:49
Добавление свойств посредством DOM Bajjy Общие вопросы Javascript 8 02.10.2008 14:51