Цитата:
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, время: 03:51. |