1

詳細モードの google-closure-compiler は、次のコードに対して警告します。これは名前空間の平坦化が原因です。

var com.my.test.namespace = {};
com.my.test.namespace.a = new Class ({
    name : "test",
    initialize : function() {   //constructor
        alert(this.name);
    }
});

com.my.test.namespace.a();

デバッグを有効にして google-closure-compiler を ADVANCED モードで実行すると、com.my.test.namespace.a が com$my$test$namespace$a に置き換えられます。

したがって、縮小されたコードはおおよそ次のとおりです。

var com.my.test.namespace = {};
com$my$test$namespace$a = new Class ({
    name : "test",
    initialize : function() {   //constructor
        alert(this.name);
    }
});

com$my$test$namespace$a();

com$my$test$namespace$a() が呼び出されると、「これ」はもはや com.my.test.namespace ではなく、ウィンドウであるため、コンパイラの警告が表示されます。

一部のドキュメントでは、この問題を回避するために「this」を com.my.test.namespace.a に置き換えることを提案しています。しかし、それは正しいことですか?com.my.test.namespace.a.name は何を指していますか? 現在のインスタンスの「名前」プロパティのようには見えません。

それを行う正しい方法は何ですか?com.my.test.namespace.a.prototype.name ?

PS:
I am using mootools library for the Class method.
4

1 に答える 1

2

初期化がコンストラクターの場合、「this」は名前空間ではなく型の名前にする必要があります。これは、コンパイラーのためにこれにどのように注釈を付ける必要があるかです

/** @const */
var namespace = {};

/** @constructor */
namespace.a = new Class (/** @lends {namespace.a.prototype} */{
    name : "test",
    initialize : function() {
        alert(this.name);
    }
});

new namespace.a();

ここに私が持っているものがあります:

  1. const 名前空間。必須ではありませんが、型チェックを改善します。
  2. コンストラクター宣言 (型名を導入)
  3. オブジェクト リテラルの @lends は、プロパティが型宣言で使用されていることを示します。

Closure Compiler には Moo ツールの Class 宣言に関する特定の知識が組み込まれておらず、それが型定義の一部として使用されていることを理解させる必要があるため、ここで @lends が必要です。

于 2013-07-30T15:20:09.543 に答える