Javascript ES5:如何扩展函数对象,以便在每次执行函数时对自身设置属性值



我目前有以下工作代码:

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实例中,在本例中,一个id1 的对象,当fn1传播到baseFn时可以检查该对象

JSFiddle Link - 调用方演示

相关内容

  • 没有找到相关文章

最新更新