2012-03-05 10 views
12

JSON文字列を含むHTMLがあります。私は、Googleの閉鎖によってコードを実行すると、その後「MyObjectでプロパティMyProp1が定義されていません」という警告を防止するにはどうすればよいですか?

var SomeVar = MyObject.MyProp1; 

そして:DOM準備コールバックにで、私はこのようなものがあります:

MyObject = JSON.parse($('#TheJsonString').html()); 

後の私のコードでは、私はこの何かを書きますコンパイラ、私は警告を得る

プロパティMyProp1は決してMyObjectで定義されていない。

警告を生成しないようにコードを書き込むべきですか?

答えて

14

警告を削除するクリーンな方法は、JSONの構造を定義することです。

/** @type {{MyProp1:string}} */ 

MyProp1は、プロパティの名前、stringがタイプです:これは@typeタグを使用して行うことができます。

GoogleのClosureコンパイラは変数の名前を変更します。

MyObject['MyProp1'] 

:あなたはそれをしたくない場合は、ドット表記の代わりに引用符+ブラケットを使用する必要が

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// ==/ClosureCompiler== 

var MyObject; 
function x() { // Magic happens at the next line 
    /** @type {{MyProp1:string}}*/ 
    MyObject = JSON.parse(prompt('')); 
} 
function afterX() { 
    var SomeVar = MyObject.MyProp1; 
    alert(SomeVar); 
} 
x(); 
afterX(); 

出力:Closure Compilerに以下を貼り付け

var a;a=JSON.parse(prompt(""));alert(a.a); 
+0

ありがとう、今それは動作します!全体的には、ドット表記法か括弧表記を使用する方が「良い」か、それともスタイル/優先度の問題ですか?また、私はGoogleのコンパイラを使用して、jscramblerでコンパイルされたコードを再読込みする予定です。私はリバースエンジニアリングを妨げないだろうと知っていますが、私は時間を買うことを探しています。二重難読化は機能しますか? – frenchie

+1

@frenchie一般的には、ブラケット/ドット表記は優先事項です。ただし、クロージャーコンパイラでは、名前を保持するために括弧表記を使用する必要があります。しかし、コンパイルされた出力ではドット表記が使用されます。そして、はい、二重難読化は実際にリバースエンジニアリングをより困難にします。難読化の前後でコードのパフォーマンスをテストすることを確認してください。 –

1

JSONコンテンツをHTMLとして#TheJsonStringオブジェクトに入れるのではなく、ページに実際のjavascriptとして配置する必要があります。サーバーがページ内のコンテンツを生成している場合、サーバーがHTMLを生成して解析する必要はありません。サーバーはスクリプトタグ内でjavascript変数を作成し、実際のjavascriptデータ構造をその中に入れることができます。

JSON.parse()は、Ajaxレスポンスの解析に非常に便利ですが、サーバが最初に生成されたページに完成したjavascriptを置くことができれば本当に必要ありません。

+0

私はjsonの文字列をリテラルに入れていますので、div内にあるブラウザに表示されます。 Asp.net – frenchie

+0

@frenchie - あなたがdivに入れていることは分かっています。私はあなたがなぜそれをjavascript変数に直接入れることができるのかを尋ねています。あなたのページに文字列形式でそれらを入れる理由はありません。これは、実際のjavascriptで定義されるため、Googleクロージャの問題も解決します。 – jfriend00

+1

実際には12個のjson文字列があり、リテラルはマスターページコードの後ろに挿入されます。私は.masterファイルに醜いサーバのeval文を持たせたくありません。私はjsonステートメントを持っていないので、それはとにかくコンパイラの問題を解決しません。実行時に評価されます。 – frenchie

0
<!DOCTYPE html> 
<html> 
<head></head> 
<body> 
<div id="TheJsonString"> 
    {"bindings": "hr", "method":"asd"} 
</div> 
<script type="text/javascript" src="jquery-1.7.1.min.js"></script> 
<script type="text/javascript"> 
    var MyObject = JSON.parse($('#TheJsonString').html()); 

    var SomeVar = MyObject.bindings; 

    console.log(SomeVar); 
</script> 
</body> 
</html> 

私はこのようにテストしましたが、警告なしで正常に動作します。

+0

問題は、Googleコンパイラにコードを貼り付けるときにjson文字列を持たないことです.jsonは実行時に生成され、すべてのユーザーごとに異なります。私はそれをもっと考えるほど、オブジェクトを作成してjsonのパースをキャストする必要がある、プロトタイプの継承に解決策があると思います。 – frenchie

3

は、このようにプロパティにアクセスしてみてください:

var SomeVar = MyObject['MyProp1']; 
7

特定の機能に対してこの警告を表示しないようにするには、@suppress注釈を使用します。

/** 
* @suppress {missingProperties} 
*/ 
function useJsonObject() { ... } 

は、この警告グローバルをオフにmissingPropertiesclass of warningsをオフにするjscomp_offコンパイラフラグを使用します。

関連する問題