Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Название вызвавшего свойства (https://javascript.ru/forum/misc/50751-nazvanie-vyzvavshego-svojjstva.html)

max0n 09.10.2014 19:01

Название вызвавшего свойства
 
привет всем )

у меня есть объект:
var o = new Object();

к нему может добавиться произвольное количество свойств формата:
o.func24 = function(){
/* some code here */
}

вопрос: как мне при вызове свойства:
o.func24();

получить название исполняемого свойства ("func24")?
очерёдность, варианты и количество свойств может меняться постоянно.

P.S. смог найти только вывод всего списка свойств (Object.keys(o)).
Но это не то… помогите плз.

kostyanet 09.10.2014 19:10

Тут вроде рассказано http://www.seifi.org/javascript/java...arguments.html

kostyanet 09.10.2014 19:15

Цитата:

Сообщение от max0n
P.S. смог найти только вывод всего списка свойств (Object.keys(o)).

Потому что .keys(o) метод, а не свойство.

tsigel 09.10.2014 19:20

max0n,
Либо писать в методы именованные функции. и забирать имя через arguments.callee.name,
Либо перебором.

Вариант 1:
var o = {
  
  func1: function func1() {
    alert(arguments.callee.name);
  },
  func2: function func2() {
    alert(arguments.callee.name);
  }
   
}
o.func1();
o.func2();

Вариант 2:
var o = {
  
  func1: function func1() {
    for (var name in this) {
      if (this[name] === arguments.callee) {
        alert(name);
      }
    }
  },

  func2: function func1() {
    for (var name in this) {
      if (this[name] === arguments.callee) {
        alert(name);
      }
    }
  }
   
}
o.func1();
o.func2();

max0n 09.10.2014 21:16

tsigel,
а если у меня 100 свойств... мне к каждому прописывать полностью функцию?
могу я както скопировать функцию?
чтото типо:

o.func2 = o.func1();

tsigel 09.10.2014 21:31

Скопировать функции можно, но то что вы хотите выглядит очень неправильным. Может быть вы расскажете зачем вам это понадобилось и как добавляются функции в объект и тогда можно придумать более правильное решение?

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

var o = {
  
  func1: function func1(name) {
    alert(name);
  },

  func2: function func1(name) {
    alert(name);
  },

  call: function (name) {
    this[name](name);
  }
   
}
o.call("func1");
o.call("func2")

max0n 09.10.2014 22:06

ну... у меня постепенный запуск анимации на сайте.
загружается страница....
на ней подгружаются блоки с анимацией.
Каждый раз разное количество.
как только браузер докрутил до блока, запускается функция, названная как ID блока, который виден.

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

kostyanet 09.10.2014 22:31

Цитата:

Сообщение от max0n
а если у меня 100 свойств... мне к каждому прописывать полностью функцию?

В js вместо наследований предусмотрен prototype. Мне вот эта статья показалась самой доходчивой. http://yehudakatz.com/2011/08/12/und...in-javascript/

kostyanet 09.10.2014 22:34

Цитата:

Сообщение от max0n
Каждый раз разное количество.

И обязательно давать всем кадрам уникальное имя чтобы ... я не знаю что.

Ну не колется народ и все. Будет мучиться (я в третьем лице), страдать, ничего не решит, плюнет, или нагородит колхоза, но никогда не расскажет что хочет сделать, что получается и как оно должно быть по замыслу.

Это типа западло что ли считается у нас?

kostyanet 09.10.2014 22:38

Допустим запускается анимация, у каждого кадра свои характеристики: ширина, высота, куда двигать, какой эффект, своя подпись и все такое. Угадал? От вас же не дождешься.

Значит все данные есть, надо только закатать их в массив для js. Ну так и закатывайте. По индексу. То есть у вас будет не объект с кучей методов, а массив с кучей объектов и 1 методом. Который будет хавать проперти и делать из то, что предусмотрено интерфейсом.

Ну типа у вас будет аниматабле интерфейс. Есть итерабле, коунтабле, компарабле и прочие абле, а у вас - аниматабле.


Часовой пояс GMT +3, время: 02:31.