1

オブジェクトの本体になくても、オブジェクトで呼び出されたメソッドを見つけることはできますか?

つまり :

 function foo() {
   if(! (this instanceof foo) ) return new foo();
   alert(this.find_which_method_was_called()); // output 'myMethod'
 }

 foo().myMethod();
4

1 に答える 1

4

myMethod()はコンストラクターが戻った後に呼び出されるfoo()ため、コンストラクターで呼び出されたかどうかを知ることはできません。

ただし、オブジェクトをプロキシでラップし、呼び出されたすべての関数の名前を配列に保存することはできます。

function Proxy(object) {

    this.calledFunctions = [];

    for (var name in object) {
        if (typeof object[name] != 'function') {
            continue;
        }
        this[name] = (function (name, fun) {
            return function() {
                this.calledFunctions.push(name);
                return fun.apply(object, arguments);
            };
        }(name, object[name]));
    }
}

今、あなたはこれを行うことができます:

var f = new Proxy(new foo());
f.myMethod();
alert(f.calledFunctions);
于 2012-07-05T15:35:37.563 に答える