【发布时间】:2016-03-01 04:40:12
【问题描述】:
如何在不知道其名称的情况下从其内部获取实例化 JavaScript 函数的名称?
我需要它的原因是因为我开始处理异常,并且我想稍后将异常的名称作为字符串获取,而无需手动将名称写入异常函数本身,就像在 MDN 文档中的示例中一样: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/throw
示例:
function MyException(message) {
this.message = message;
this.name = 'MyException'; // How to get function name automatically?
this.toString = function() {
return this.name + ': ' + this.message;
};
}
try {
throw new MyException('Hello world');
}
catch (e) {
alert(e); // "MyException: Hello world"
}
有Function.name,但是一旦函数被实例化(通过new 运算符)它就不能使用,因为函数随后变成了一个没有任何属性或方法的对象。
【问题讨论】:
-
您可以使用拆分 toString() 的 getter 填充 IE9+ 的 .name,或者只记录 toString()
-
我不明白。如何?没有
name属性并且toString()方法只返回[object Object],因为此时MyException 不再是一个函数(它之前通过new运算符转换为一个对象)。请举例说明你的意思吗? -
您可以使用实例的
constructor属性来获取函数... -
嗯...是的。这将规避
callee的严格模式问题。这是一个额外的解决方案,但我更喜欢只编写一次提取代码(使用继承),而不是一次又一次地编写所有异常。否则,如果发生变化,就需要修改每一个异常函数。但你是对的 - 我没有想到构造函数属性。谢谢。
标签: javascript