2012-06-15 1 views
5

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

Element.prototype._removeChild = Element.prototype.removeChild; 
Element.prototype.removeChild = function(){ 
    callback(); 
    this._removeChild.apply(this,arguments); 
} 

Я хочу, чтобы динамически получить имя методы (в данном случае «RemoveChild») изнутри динамически переписываемой функции. Я использую arguments.callee.name, но, похоже, ничего не возвращает, думая, что это просто анонимная функция. Как получить имя функции, которой назначена анонимная функция?

+4

Javascript не имеет методов. Только функции, назначенные свойствам. В этом случае «Element.prototype.removeChild» - это одно свойство, в котором оно назначено, оно также может быть назначено в другое место одновременно. Это не имя функции, у нее нет имени. Функция не знает, сколько свойств ей назначено или какие свойства ей назначены. – Esailija

ответ

5

Это is анонимная функция. Вы просто назначаете эту анонимную функцию свойству Element.prototype.removeChild, но это свойство не делает это свойство именем для функции. Вы можете назначить одну и ту же функцию многим переменным и свойствам, и нет способа узнать имя, по которому оно было вызвано.

Однако вы можете задать функцию собственное имя, которое вы можете получить доступ в arguments.callee.name:

Element.prototype.removeChild = function removeChild() { 
    .... 
} 
+0

ahhhh делает 100% -ный смысл. благодаря! – user730569

+1

+1 Это прекрасно, потому что тогда функция может ссылаться на себя с помощью 'removeChild', но' removeChild' по-прежнему не определена вне функции. За исключением IE 8 и ниже, который на самом деле не реализует Javascript правильно. В IE 8 и под 'removeChild' выставляется внешняя область (возможная глобальная), если вы не завершаете закрытие всего объекта:' (function() {Element.prototype.removeChild = function removeChild() {...})(); ' – Paulpro

+0

Поскольку вы дали функции имя, вы можете использовать это имя вместо устаревшего' arguments.callee'. Но опять же, 'removeChild.name' ...: P – Esailija

Смежные вопросы