Название вызвавшего свойства
привет всем )
у меня есть объект: var o = new Object(); к нему может добавиться произвольное количество свойств формата: o.func24 = function(){ /* some code here */ } вопрос: как мне при вызове свойства: o.func24(); получить название исполняемого свойства ("func24")? очерёдность, варианты и количество свойств может меняться постоянно. P.S. смог найти только вывод всего списка свойств (Object.keys(o)). Но это не то… помогите плз. |
Тут вроде рассказано http://www.seifi.org/javascript/java...arguments.html
|
Цитата:
|
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(); |
tsigel,
а если у меня 100 свойств... мне к каждому прописывать полностью функцию? могу я както скопировать функцию? чтото типо: o.func2 = o.func1(); |
Скопировать функции можно, но то что вы хотите выглядит очень неправильным. Может быть вы расскажете зачем вам это понадобилось и как добавляются функции в объект и тогда можно придумать более правильное решение?
Например на вскидку сделать объекту метод для вызова функций, который бы вызывал функцию и пихал бы ей имя ключа первым аргументом, тогда и париться не надо. Например: 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") |
ну... у меня постепенный запуск анимации на сайте.
загружается страница.... на ней подгружаются блоки с анимацией. Каждый раз разное количество. как только браузер докрутил до блока, запускается функция, названная как ID блока, который виден. Анимация запускается и удаляется свойство, чтобы не запускалось до перезагрузки страницы. |
Цитата:
|
Цитата:
Ну не колется народ и все. Будет мучиться (я в третьем лице), страдать, ничего не решит, плюнет, или нагородит колхоза, но никогда не расскажет что хочет сделать, что получается и как оно должно быть по замыслу. Это типа западло что ли считается у нас? |
Допустим запускается анимация, у каждого кадра свои характеристики: ширина, высота, куда двигать, какой эффект, своя подпись и все такое. Угадал? От вас же не дождешься.
Значит все данные есть, надо только закатать их в массив для js. Ну так и закатывайте. По индексу. То есть у вас будет не объект с кучей методов, а массив с кучей объектов и 1 методом. Который будет хавать проперти и делать из то, что предусмотрено интерфейсом. Ну типа у вас будет аниматабле интерфейс. Есть итерабле, коунтабле, компарабле и прочие абле, а у вас - аниматабле. |
var frames=[];
for() // где-то же есть данные // показаны скаляры, но где-то же есть данные var frame = { // дефолтный прототип w:1000, // ширина h:600, speed:1,9763553, dir:'top-left', effect:'sepia', delay:9000, ... }; frames.push(frame); } Угадал? Нет, ну жаль. |
не лишнее к прочтению
http://javascript.ru/forum/misc/4895...a-funkcii.html |
На самом деле интересная тема. Я тоже как-то пытался ради интереса получить название случайной функции из объекта и даже как-то сделал такое, но потом удалил и забыл :(
|
Цитата:
var o = new Object(); то это говорит о том, что он не знает языка вообще. А также не различает понятия "имя функции" и "имя свойства". Один из вариантов ответов на вопрос ТС: var object = {}; object.method = function(prop) { alert(prop); }.bind(object, 'method'); object.method(); Или через замыкание. |
Цитата:
|
Цитата:
Мне думается, что new Object это было дано для примера и обозначало какой-то пользовательский объект. Цитата:
object.someRandomMethodName(); Выдаёт ошибочку: TypeError: object.someRandomMethodName is not a function |
По теме, есть такой изврат:
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. |