如何从另一个原型方法中识别javascript原型方法调用者的名字

时间:2013-07-06 01:35:02

标签: javascript

有两个javascript“对象类” MyClass1 MyClass2 ,其中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类和方法。

1 个答案:

答案 0 :(得分: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
}

但请注意,此方法取决于函数的nameMyClass1.prototype上定义的属性名称相同。如果将名为bar的函数分配给MyClass1.prototype.foo,则此方法将无效。