Цитата:
function FunctionNameExtractorFactoryError () { this.name = 'FunctionNameExtractorFactoryError'; } FunctionNameExtractorFactoryError.prototype = Object.create(Error.prototype); function FunctionNameExtractorFactory () { return this; } FunctionNameExtractorFactory.buildFunctionNameExtractorInstance = function () { return FunctionNameExtractorFactory.commonFunctionNameExtractor; }; FunctionNameExtractorFactory.commonFunctionNameExtractor = function (fn) { if (!fn instanceof Function) { throw new TypeError('argument \'fn\' is not instance of Function'); } if (fn.name) { return fn.name; } else { return FunctionNameExtractorFactory.fallbackFunctionNameExtractor(fn); } }; FunctionNameExtractorFactory.fallbackFunctionNameExtractor = function (fn) { if (!fn instanceof Function) { throw new TypeError('argument \'fn\' is not instance of Function'); } try { var source = (fn.toSource || fn.toString).call(fn); } catch (e) { if (e instanceof TypeError) { throw new FunctionNameExtractorFactoryError('Can\'t get function name due unknown malfunction.'); } else { throw e; } } var match = source.match(/function(?:\s+(.*?))?(?=\()/); return match ? match[1] : null; }; FunctionNameExtractorFactory.prototype.buildFunctionNameExtractorInstance = function () { return this.constructor.buildFunctionNameExtractorInstance(); }; Вызывать так: var functionNameExtractorFactory = new FunctionNameExtractorFactory(); var functionNameExtractor = functionNameExtractorFactory.buildFunctionNameExtractorInstance(); functionNameExtractor(arguments.callee); |
Изначально наверно имелось в виду имя метода а не имя функции. И скорее всего для того что бы иметь возможность перегрузить этот метод это вроде как зеркалированием называется т.е.
var Obj = {}; Obj.methodName = function functionName (){ retutn Obj } К сожалению внутри functionName() довольно сложно получить Obj.methodName А возможность перегружать методы весьма и весьма полезная штука Ну например есть желание последовательно выполнять кучу анимаций .. Обычно бля этого используют функции обратного вызова т.е. Element.moveLefr ({ speed:10; time: 1000; success : function (e){ e.moveAp ({ speed:10; time: 1000; success : function (e){ ....... //( и.т.д и.т.п ) } }) }}) Но если есть возможность перегрузить функции moveLefr и moveAp можно писать проще Element.moveLefr(10,1000).moveLefr(30,2000) // и.т.д. Для этого требуется что бы moveLefr() не выполняла анимацию а просто запомнила свое имя и правильно разместила себя в очереди анимации и вернула объект у которого есть метод moveLefr() т.е. вернула родительский объект у которого определены все методы |
этот метод, moveLefr, и его вызов, они отвратительны, нет?
похоже, что через все попытки сделать нормальный инструмент для анимации, ни у кого это так и не получилось .... |
Цитата:
|
Цитата:
Тут больше вопрос в том что довольно сложно получить имя метода из самого метода. Единственный известный мне способ это сравнивание arguments.callee с методами объекта что выглядит довольно ужасно |
Цитата:
http://motorcortexjs.com/ и... оно тоже косячное т.е. замешая микстуру из вышеупомянутого двига, processingjs, Web Animations можно сделать что-нибудь интересное. не без косяков, конечно :haha: Цитата:
|
Цитата:
let item = { value: false, setItem: function(value) { item.value = value; }, checkItem: function(funcName) { if (!item.value) console.error('Функция "%s" получила не присвоенное значение', funcName); }, add: function(value) { item.checkItem(arguments.callee.name); item.value = item.value + value; }, subtract: function(value) { item.checkItem(arguments.callee.name); item.value = item.value - value; }, clear: function() { item.checkItem(arguments.callee.name); item.value = false; }, getItem: function() { item.checkItem(arguments.callee.name); return item.value; } }; item.clear(); Функция "clear" получила не присвоенное значение |
В строгом режиме не будет работать.
В модулях |
Часовой пояс GMT +3, время: 17:03. |