2016-07-21 11 views
0

私はJavaScriptで関数を実行していることを確認する必要があります。実際には正しい関数です(例:呼び出すには関数something.stuff.morestuff.coolFunctionが必要です。 私はFunction.callerを取得しようとしましたが、これは関数自体を返すだけで、内部にあるオブジェクトを特定する方法はありません。Javascript呼び出し元関数の親子

function helloWorld(){ 
    if(/* the exact path to the calling function */ === 'greetings.happy.classic.sayhello'){ 
     console.log('Hello World'); 
    }else{ 
     console.log(/* the path from earlier */ + ' not allowed.'); 
    } 
} 

greetings = { 
    happy: { 
     classic: { 
      sayHello: function(){ helloWorld(); } 
      sayBye: function(){ helloWorld(); } 
     } 
    }, 
    angry: { 
     sayHello: function(){ helloWorld(); } 
    }, 
    simple: [ 
     function(){ helloWorld(); } 
    ] 
} 
function sayWords(){ 
    helloWorld(); 
} 

私が達成しようとしている何を次のようになります:次のセットアップが考える

greetings.happy.classic.sayHello(); // => Hello World! 
greetings.happy.classic.sayBye(); // => greetings.happy.classic.sayBye not allowed. 
greetings.angry.sayHello();   // => greetings.angry.sayHello not allowed. 
greetings.simple[0]();    // => greetings.simple[0] not allowed. 
sayWords();       // => sayWords not allowed. 
helloWorld();      // => null not allowed. 
// not sure what would come out of this, so i put null on that one 

は、ここに1つの小ぎれいなパッケージでの質問です:

呼び出し元関数の正確なオブジェクトパス(すなわちgreeting.happy.classic.sayHello)をどのように見つけることができますか? Function.caller.nameは関数の名前を返すだけで十分ではありません。呼び出し関数の場所の完全なツリーが必要です。

これは複雑な問題のように感じます。ご協力いただきありがとうございます。

+0

...プリプロセッサ/ uglyfier /バンドラは、あなたのアプローチを破る可能性が高い以上であることを認識しております。ネストされた両親のそれを超えて、私はあなたがそれを行うことができるとは思わないし、私はそれが必要だとは思わない。関数を呼び出すかどうかの決定段階が下流に置かれないように、または関数が何をすべきかを決定するために引数を渡すことを試みるように、アルゴリズムを配線することができます。私はかなりあなたがそれを達成するための方法のトンを見つけることができると確信しています。 – Redu

+0

関数で 'this'を使うと、別の関数で呼ばれたとしても、呼び出し元の' this'スコープにはアクセスしません。関数自体の 'this'スコープだけです。 'this'は、関数を呼び出す関数ではなく、関数が存在するオブジェクトを参照します。 – MineAndCraft12

答えて

0

まあ、子オブジェクトで親の参照を見つけようとしているようです。これは不可能です。このポストを確認してくださいJavascript Object get parent

+0

これは呼び出し元のオブジェクト自体の参照からは真実だと思われますが、呼び出し元関数の名前の代わりに呼び出し元関数への完全なパスを取得する方法がいくつかあると思います。私は何かが出てくるのを見るのを待つつもりですが、これまでのところ、私が呼び出し元を追跡する以外にこれを行う別の方法を見つける必要があるかもしれないように見えています... – MineAndCraft12

+0

私は実際にユーザーが許可を求めているのは、保護されている関数を呼び出すことができる関数が呼び出される可能性があることを思い出したからです。ユーザーのアクセス許可は少し信頼性が高いようです。 – MineAndCraft12

0

new Error().stack私はどこからコールが来るかを分析することができると思います。

うまくいけば、機能を呼び出すオブジェクトがその関数内で `this`キーワードと呼ばれている

+0

これは非常に良いアイデアでした。しかし私はこれを私の他のプロジェクトの一つに挿入してコンソールをチェックしようとしましたが(あなたの解決策を試したプロジェクトはこれとは無関係です)、アプリの実際のパスの代わりに 'Object.delete'をスタックに入れました。 savemaster.vars.delete' ... – MineAndCraft12

+0

はい、そうです。オブジェクトを返すと、スタックからフレームがポップされるので、オブジェクトスタックを追跡することはできません。あなたは手動でオブジェクトの親子関係を追跡し、それを使用する必要があります... – alebianco

関連する問題