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 методом. Который будет хавать проперти и делать из то, что предусмотрено интерфейсом.

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

kostyanet 09.10.2014 22:41

var frames=[];
for() // где-то же есть данные
// показаны скаляры, но где-то же есть данные
var frame = { // дефолтный прототип
w:1000, // ширина
h:600,
speed:1,9763553,
dir:'top-left',
effect:'sepia',
delay:9000,
...
};
frames.push(frame);
}

Угадал? Нет, ну жаль.

MallSerg 10.10.2014 01:01

не лишнее к прочтению
http://javascript.ru/forum/misc/4895...a-funkcii.html

Safort 10.10.2014 01:54

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

nerv_ 10.10.2014 12:09

Цитата:

Сообщение от Safort
На самом деле интересная тема

бессмысленная и беспощадная :) Если чел объект создает так
var o = new Object();

то это говорит о том, что он не знает языка вообще. А также не различает понятия "имя функции" и "имя свойства".

Один из вариантов ответов на вопрос ТС:
var object = {};

object.method = function(prop) {
    alert(prop);
}.bind(object, 'method');

object.method();


Или через замыкание.

Erolast 10.10.2014 13:47

Цитата:

Если чел объект создает так
var o = new Object();

то это говорит о том, что он не знает языка вообще.
А чо не так? Ну, кроме того, что нафиг надо.

Safort 10.10.2014 17:21

Цитата:

Сообщение от nerv_ (Сообщение 334594)
бессмысленная и беспощадная :) Если чел объект создает так
var o = new Object();

то это говорит о том, что он не знает языка вообще. А также не различает понятия "имя функции" и "имя свойства".

Ну почему же сразу бессмысленная?) Мозги поразмять, например)
Мне думается, что new Object это было дано для примера и обозначало какой-то пользовательский объект.




Цитата:

Один из вариантов ответов на вопрос ТС:
var object = {};

object.method = function(prop) {
    alert(prop);
}.bind(object, 'method');

object.method();


Или через замыкание.
Неа)
object.someRandomMethodName();

Выдаёт ошибочку: TypeError: object.someRandomMethodName is not a function

Erolast 10.10.2014 19:16

По теме, есть такой изврат:
var obj = {
  someMethod: function() {
    for (var method_name in this) {
      if (this[method_name] == arguments.callee)
        break;
    }
    
    alert(method_name);
  }
}
obj.someMethod();

Но это, во-первых, не сработает в strict mode, во-вторых, сработает некорректно, если на эту функцию ссылается более одного свойства объекта, в-третьих, сработает некорректно, если функция вызывается в контексте объекта другого. Вообще, такой задачи не должно вставать, с архитектурой явно что-то не так... Но да уже говорили.


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