我目前有以下工作代码:
Function.prototype.GetLastCallerName = function () {
if (!this.arguments || !this.arguments.callee || !this.arguments.callee.caller) return null;
var result = /^functions+([w$]+)s*(/.exec(this.arguments.callee.caller.toString());
this.LastCaller = result ? result[1] : 'Anonymous';
return this.LastCaller;
};
我从另一个线程中获取了该代码。 如您所见,它扩展了 Function.prototype 以添加一个名为 GetLastCallerName
的方法,该方法选择最后一个调用函数名称,并 (1( 将其设置为 Function.LastCaller
LastCaller
,(2( 返回它。
为了使它工作:
function MyFunction1() {
MyFunction1.GetLastCallerName();
console.log(MyFunction.LastCaller);
}
function MyFunction2() {
MyFunction1();
}
MyFunction2();
我希望能够做的是:消除每次都使用GetLastCallerName()
的需要,并扩展Function
以便在每次调用任何函数时执行该获取。
我正在努力遵循您到目前为止尝试过的示例,但我想我明白您想做什么。为什么不利用类,并针对您的用例扩展它们。查看以下示例...
class Base {
baseFn() {
console.log('from base');
}
}
class Thing extends Base {
fn1() {
this.baseFn();
}
}
let thingee = new Thing();
thingee.fn1();
因此,现在总是在调用fn1
时调用baseFn
。
JSFiddle Link - 类演示
在您的一些评论中,您似乎想要获取"最后一个调用函数的名称"。如何将调用方本身的实例传回父级?这肯定会给您带来更大的灵活性,因为现在您可以随心所欲地雕刻您的呼叫者。查看以下内容...
class Base {
baseFn(caller) {
console.log(caller.id); // 1
}
}
class Thing extends Base {
constructor(id) {
super();
this.id = id;
}
fn1() {
this.baseFn(this);
}
}
let thingee = new Thing('1');
thingee.fn1();
现在,您可以将所需的任何内容添加到Thing
实例中,在本例中,一个id
为 1
的对象,当fn1
传播到baseFn
时可以检查该对象
JSFiddle Link - 调用方演示