0

というグローバル スコープで定義された大きなオブジェクトがありますglobal。グローバル変数の下で参照されているすべてのプロパティを動的に検索したいと考えています。つまり、コードの実行中にアクセスされたすべてのプロパティです。

静的コード分析を実行して、変数の下で参照されているすべてのプロパティを抽出したいと考えています。これらのパターンを検索できます: global.PROPERTY_NAME AND global[PROPERTY_NAM]. しかし、これらのような複雑なケースはどうですか

var tmp="PROPERTY_NAME";
global[tmp]

また

var tmp=global;
tmp.PROPERTY_NAME

そして他のものは?

すべての変数のプロパティを取得したくありません。参照されているONESのリストのみが必要です!! ソース コードでのみ参照されたプロパティ

4

2 に答える 2

3

編集後:

あなたが探しているのはJavaScriptプロキシオブジェクトです。これらを使用してこれを行う方法のチュートリアルを次に示します。

プロキシオブジェクトを使用すると、オブジェクトをラップして、そのプロパティにアクセスするたびにメソッドを実行できます。残念ながら、現在のところ、広くサポートされていません。

これは現在、JavaScriptで、元のglobalオブジェクトを変更せずにこれを実現する唯一の方法です。

about:flagsタブで実験的なJavaScriptを有効にすることで、Chromeでそれらをオンにできます。

編集前:

あなたが探している機能はリフレクションと呼ばれ、JavaScriptはそれをネイティブにサポートします

オブジェクトを反復処理してそのプロパティを取得するコードを次に示します。

for(var prop in global){
    if(global.hasOwnProperty(prop)){ //this is to only get its properties and not its prototype's
        alert(prop+" => "+global[prop]);
    }
}

これはかなりクロスブラウザです。最近のブラウザでは、すべての列挙可能なプロパティを含む配列を返すObject.keys(global)や、列挙可能なプロパティと列挙不可能なプロパティの両方を返すObject.getOwnPropertyNames (global)など、より簡単な方法でこれを行うことができます。

于 2013-03-01T14:36:06.940 に答える
1

JavaScriptの動的な性質により、静的コード分析ではそれを達成できません。このようなケースについて考えてみてください。

var prop = document.getElementById('prop').value;
global[prop];

不可能。別の動的分析では、グローバルオブジェクトを変更して、そのプロパティへのアクセスをログに記録してから、コードを実行します。これはJavaScriptで簡単に可能ですが、すべての可能なアクセスをカバーしていることをどのように保証するので、どちらも役に立ちません。特に5MBのJavaScriptでは、監視する可能性が最も高いエッジケースがあります。

したがって、要件を絞り込むことができない場合、それは不可能です。

于 2013-03-01T14:53:03.137 に答える