【问题标题】:How to get object from which function was called?如何从调用哪个函数中获取对象?
【发布时间】:2019-06-15 07:04:18
【问题描述】:

这是我的一个难以回答的问题。 我正在尝试创建一个函数,该函数可以检测到它被调用的对象和属性。该函数必须适用于任何类的任何方法或任何属性。这是我的目标:

Object.prototype.WHO_AM_I = function WHO_AM_I()
{
    print("FUNCTION CALLED FROM: ? ITEM IN ?? CLASS.");
}

class CLASS
{
    constructor()
    {
        this.PROPERTY = "";
    }
    METHOD()
    {
        return;
    }
}

let OBJECT = new CLASS()
OBJECT.PROPERTY.WHO_AM_I();
OBJECT.METHOD.WHO_AM_I();

我希望这段代码输出的是:

FUNCTION CALLED FROM PROPERTY ITEM IN CLASS CLASS.
FUNCTION CALLED FROM METHOD ITEM IN CLASS CLASS.

因此,我的目标是获取调用函数 WHO_AM_I 的方法或属性的名称以及定义此项的类的名称。

示例 2:

"TEST".substring.WHO_AM_I();
[].length.WHO_AM_I();

应该输出:

FUNCTION CALLED FROM: substring ITEM IN String CLASS.
FUNCTION CALLED FROM length ITEM IN Array CLASS.

我希望你能得到这张照片。所以我要做的是在整个javascript中创建的每个对象中注入WHO_AM_I方法,并希望能够在整个javascript中的任何方法或任何类的任何属性上调用此方法,无论它是否是我自己的类或者java脚本的内置类。

我可以在WHO_AM_I 方法中使用this。这将使我获得对调用 WHO_AM_I 方法的属性或方法的引用。但真正的问题是如何获得定义此方法或属性的类?我想不通。 super 没有帮助,因为它指向项目的父对象,而不是定义项目的对象。另外,除非项目是方法,否则我无法获取项目的名称,在这种情况下,我可以使用this.name 来获取方法的名称。还有我卡住的地方。我能先解决这个问题吗?如果我输入this.name,则在WHO_AM_I 方法中标记,但它仅在我在另一个方法上调用WHO_AM_I 方法时才有效,而不是在类的属性上。但我不能解决这个问题一秒钟??问号。

所以我的问题是: 是否可以在 javascript 中找出定义了哪个类方法? 如果是的话,我应该在我的WHO_AM_I 方法中用什么代替??? 我注入java 脚本对象类以产生我想要的输出?

【问题讨论】:

标签: javascript function object ecmascript-6


【解决方案1】:

这是不可能的。
即使你能得到函数的上下文(this),你也无法得到那个上下文的上下文。

我相信您正在尝试用错误的方法解决一些问题。
你能分享一下你最初的想法吗?你为什么决定买???

【讨论】:

【解决方案2】:

这不太可能 - 您需要使用(例如)代理对象,除非您选择使用非标准的 Function.caller 属性(查看兼容性表)。

【讨论】:

  • 我看不出 .caller 在这里有什么帮助 - OP 永远不会调用目标函数
  • 好的,所以除非我为每个我希望能够使用该方法的项目创建一个代理,否则这是不可能的,这太荒谬了。是的,正如@bergi 所说,我必须实际调用该函数才能访问caller 属性,并且我想在函数对象上执行此操作而不执行该函数。另外,这不适用于属性,仅适用于函数,我正在尝试制作可以同时适用于属性(变量)和方法(函数)的通用方法......
  • ...另外,我的环境不支持它(兼容性表中没有定义 - 我使用 Mongo 作为我的 javascript 解释器)。无论如何,感谢您的回复。
猜你喜欢
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2022-11-28
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多