2

有两个 javascript“对象类” MyClass1MyClass2,其中 MyClass1 中的方法 ( foo )调用MyClass2 中的方法 ( moo ),我需要动态识别谁从moo本身调用函数原型moo 。

当我使用普遍建议的 arguments.callee.caller 访问器时,我无法派生名称。总的来说,我需要从方法moo中知道它是从 MyClass1 的 moo 方法或其他方法中调用的。

function MyClass1() {
    this.myAttribute1 = 123;
}

MyClass1.prototype.foo = function () {
     var myclass2 = new MyClass2();
     myclass2.moo();
};


function MyClass2() {
    this.mySomething = 123;
}

MyClass2.prototype.moo = function () {
     console.log("arguments.callee.caller.name = " +
         arguments.callee.caller.name);
     console.log("arguments.callee.caller.toString() = " +
         arguments.callee.caller.toString());
};

在上面的示例中,arguments.callee.caller.name的结果是空的,而调用者的 toString() 方法显示了函数的主体,但不显示其所有者类或方法的名称。

这种需要的原因是我想创建一个调试方法来跟踪从方法到方法的调用。我广泛使用 Object 类和方法。

4

1 回答 1

3

您需要命名您的函数表达式。尝试这个:

function MyClass1() {
    this.myAttribute1 = 123;
}

MyClass1.prototype.foo = function foo() { // I named the function foo
     var myclass2 = new MyClass2;
     myclass2.moo();
};

function MyClass2() {
    this.mySomething = 123;
}

MyClass2.prototype.moo = function moo() { // I named the function moo
     console.log("arguments.callee.caller.name = " +
         arguments.callee.caller.name);
     console.log("arguments.callee.caller.toString() = " +
         arguments.callee.caller.toString());
};

查看演示:http: //jsfiddle.net/QhNJ6/

问题是您正在分配一个没有名称的函数MyClass1.prototype.foo。因此它的name属性是一个空字符串 ( "")。您需要命名您的函数表达式,而不仅仅是您的属性。


如果您想确定是否arguments.callee.caller来自MyClass1然后您需要这样做:

var caller = arguments.callee.caller;

if (caller === MyClass1.prototype[caller.name]) {
    // caller belongs to MyClass1
} else {
    // caller doesn't belong to MyClass1
}

但是请注意,此方法取决于name函数的 与 上定义的属性名称相同MyClass1.prototype。如果您分配一个名为barto的函数,MyClass1.prototype.foo则此方法将不起作用。

于 2013-07-06T01:42:00.313 回答