gpt4 book ai didi

javascript - 从实例化函数中获取函数名

转载 作者:行者123 更新时间:2023-12-03 07:33:35 24 4
gpt4 key购买 nike

如何在不知道其名称的情况下从其内部获取实例化 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运算符),它就不可用,因为该函数随后就变成了一个对象,而没有任何属性或方法。

最佳答案

函数提供 arguments 对象,其中包含 callee 属性,该属性是指向调用函数的指针(请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/argumentshttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee )。因此,arguments.callee 是同一实例化函数(现在是对象)的原始函数。

ECMAScript 2015 引入了 Function.name 属性 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name ),Chrome、Opera、Firefox 和 Safari 支持该属性,但在 Internet Explorer 中不支持(在我的 IE11 中,它是 undefined),因此通过 arguments.callee.name 访问实例化函数的名称适用于除 IE 之外的所有浏览器。

但是,有一个小技巧可以通过为 Function.prototype 属性创建一个辅助方法来从所有浏览器中的实例化函数(然后是对象)内部获取名称(因此它会被继承到所有函数),然后从已有的 toString() 方法中提取函数名称:

Function.prototype.getName = function()
{
var funcName = this.toString().substr(9);
return funcName.substr(0, funcName.indexOf('(')).trim();
};

function MyException(message) {
this.message = message;
this.name = arguments.callee.getName(); // Get orig. function name
this.toString = function() {
return this.name + ': ' + this.message;
};
}

try {
throw new MyException('Hello world');
}
catch (e) {
alert(e); // "MyException: Hello world"
}

注1:不支持匿名函数,因为它们没有名称。但可以使用命名函数:

var MyException = function MyException(message) {
// ...
}

注释 2:arguments.callee 在 ES5 严格模式下不可用。

注3:我使用了String.prototype.trim()trim方法,该方法在IE9+中可用。如果不可用,则创建垫片:

if (!String.prototype.trim)
{
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };
}

关于javascript - 从实例化函数中获取函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35714806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com