在原型定义中获取此函数的名称

时间:2015-01-26 23:47:48

标签: javascript

是否可以引用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 个答案:

答案 0 :(得分:1)

如果这只是用于调试,您可以使用以下内容,它使用堆栈跟踪查找函数的名称,利用它所做的浏览器魔术来查找“names”功能。在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/

播放

答案 1 :(得分:0)

您可以使用myName.name

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

但请注意,这是在ECMAScript 6中引入的,因此大多数浏览器还不支持它。

只有Firefox支持它很长一段时间,因为它是非标准功能,在制作ES6规范之前。

另见MDN article