1

我目前有以下工作代码:

Function.prototype.GetLastCallerName = function () {
  if (!this.arguments || !this.arguments.callee || !this.arguments.callee.caller) return null;
  var result = /^function\s+([\w\$]+)\s*\(/.exec(this.arguments.callee.caller.toString());
  this.LastCaller = result ? result[1] : 'Anonymous';
  return this.LastCaller;
};

我从另一个线程中获取了该代码。如您所见,它扩展了 Function.prototype 以添加一个名为 的方法GetLastCallerName,该方法选择最后一个调用函数名称并 (1) 将其设置为LastCalleronFunction.LastCaller并 (2) 返回它。

为了使它工作:

function MyFunction1() {
  MyFunction1.GetLastCallerName();
  console.log(MyFunction.LastCaller);
}

function MyFunction2() { 
  MyFunction1(); 
}

MyFunction2();

我希望能够做的事情:消除GetLastCallerName()每次使用和扩展的需要Function,以便在每次调用任何函数时执行该获取。

4

1 回答 1

1

到目前为止,我一直在努力遵循您的示例所做的尝试,但我想我知道您想要做什么。为什么不利用,并为您的用例扩展它们。看看下面的例子......

class Base {

  baseFn() {
    console.log('from base');
  }
}

class Thing extends Base {

  fn1() {
    this.baseFn();
  }
}

let thingee = new Thing();

thingee.fn1();

所以baseFn现在总是在被调用时fn1调用。

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带有 an 的id对象1fn1baseFn

JSFiddle Link - 调用者演示

于 2017-11-13T14:32:33.973 回答