2015-01-26 4 views
1

Можно ли указать this имя функции? Например:получить имя этой функции в определении прототипа

'use strict' 
function myClass(){} 

myClass.prototype.myName = function myName(data,callback){ 
    console.log("This function has been called: " + "{???}"); // "myName" 
} 
myClass.prototype.myAge = function(data,callback){ 
    console.log("This function has been called: " + "{???}"); // "myAge" 
} 
var a = new myClass(); 
a.myName(); // 'myName' 
a.myAge(); // 'myAge'; 

Как я могу ссылаться на «myName» в строгом режиме, как это?

+2

Вы спрашиваете о свойстве 'myName' или названной функции? Вы можете уточнить, не указывая имя функции и имена свойств одинаково. –

+0

Любой способ динамически вытащить имя выполняемого метода, поэтому мне не пришлось бы жестко программировать имя функции в каждом 'console.log'. –

+0

@d -_- b вы можете создать экземпляр 'Error' и получить трассировку стека. – Pointy

ответ

1

Если это только для отладки, вы можете использовать следующее, которое использует трассировку стека, чтобы найти имя функции, используя магию браузера, чтобы найти «имена» функций. Испытано в FF, Chrome и IE 10.

function MyClass() {}; 
 

 
MyClass.prototype.myName = function() { 
 
    console.log(getCallerName(), 'I am here'); 
 
}; 
 

 
MyClass.prototype.myOtherName = function() { 
 
    console.log(getCallerName(), 'I am here again'); 
 
}; 
 

 

 
function doMe() { 
 
    console.log(getCallerName(), 'I am here in a named function'); 
 
}; 
 

 

 
function getCallerName() { 
 
    try { 
 
    throw new Error(); 
 
    } catch (e) { 
 
    if (e.stack) { 
 
     var lines = e.stack.split('\n'); 
 
     // FF (Maybe, Opera and Safari) 
 
     var ffMatch = /\b([a-zA-Z1-9\$_\.]*)@/.exec(lines[1]); 
 
     if (ffMatch) { 
 
     return ffMatch[1]; 
 
     } 
 

 
     // IE 10+ and chrome 
 
     var chromeMatch = /at (.*) /.exec(lines[2]); 
 
     if (chromeMatch) { 
 
     return chromeMatch[1]; 
 
     } 
 

 
    } 
 
    return 'unknown function'; 
 
    } 
 
} 
 

 
var a = new MyClass(); 
 

 
a.myName(); 
 
a.myOtherName(); 
 
doMe();

Играть с ним в http://jsfiddle.net/ob0w4z3k/5/

0

Вы можете использовать myName.name:

(function myName(){ 
    console.log("This functions name is " + myName.name); 
})(); // "This functions name is myName" 

Однако, обратите внимание, что это было введено в ECMAScript 6, поэтому большинство браузеров еще не поддерживают его.

Только Firefox поддерживает его в течение длительного времени, потому что это была нестандартная функция, прежде чем была создана спецификация ES6.

Также см. MDN article.

+2

Но для этого требуется знание имени функции? Если вы знаете имя, зачем использовать его '.name'? –

+0

@JuanMendes Нет, это требует только ссылки на функцию. – Oriol

+2

Но вы не используете ссылку на функцию, я думаю, что OP хотел бы что-то, что дает вам эту ссылку, не зная имя функции, например 'arguments.callee', но вы не можете использовать это, потому что это не означает, t работают в строгом режиме. –