2

returnステートメントを使用してパブリッククラスメソッドを公開するデザインパターンを使用しています。

問題は次のとおりです。ClosureCompilerのAdvancedモードで多くJSC_INEXISTENT_PROPERTY警告が表示されるため、実際に重要な警告を確認するのが困難になります。

私が使用するパターンの例:

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

/**
 * @constructor
 */
var MyClass = function() {

    var someFunc = function(myString) {
        console.log(myString);
    }

    return {
        myPublicFunc: someFunc
    };
}

var myClassInstance = new MyClass();
myClassInstance.myPublicFunc('Hello World');

警告:

JSC_INEXISTENT_PROPERTY: Property myPublicFunc never defined on MyClass \
    at line 16 character 0
myClassInstance.myPublicFunc('Hello World');

出力(フォーマット済み):

(new function() {
    return {
        a: function(a) {
            console.log(a)
        }
    }
}).a("Hello World");

Closureはコードの実行内容を理解し、コードを正しくコンパイルして、myPublicFunc一貫してに名前を変更したため、これは奇妙なことaです。では、なぜこの警告が表示されたのですか?私は何か間違ったことをしていますか?

注:実際に気になる警告も非表示になるため、これらの警告をオフにしたくありません。また、Closureでこれらを圧縮する必要があるため、引用符で囲まれた文字列やエクスポートは使用しません。

4

3 に答える 3

4

関数の注釈が正しくありません。これは実際にはコンストラクターではなく、この場合newキーワードは不要です。関数は、myPublicFuncプロパティを持つ匿名型を返すだけです。

このようなパターンに注釈を付けるには、レコード タイプを使用します。

/** @return {{myPublicFunc: function(string) }} */
var MyClass = function() {

    var someFunc = function(myString) {
        console.log(myString);
    }

    return {
        myPublicFunc: someFunc
    };
};

var myClassInstance = MyClass(); // new keyword not needed
myClassInstance.myPublicFunc('Hello World');

もう 1 つの注釈オプションは、インターフェイスを作成し、返されたオブジェクトをそのインターフェイスに型キャストすることです。このオプションは、複数の関数が同じインターフェイスに準拠するオブジェクトを返す場合に役立ちます。

于 2012-06-25T14:16:44.740 に答える
3

以下も使用できます。

/** @type {function(new:{myPublicFunc: function(string)} )} */
var MyClass = function() {...

関数は「new」で呼び出すことができますが、「MyClass」のインスタンスを返しません。

于 2012-06-25T15:51:41.317 に答える
1

追加する

MyClass.prototype.myPublicFunc = null;

これが最善の解決策であるかどうかはわかりませんが、問題は解決します。

コンパイラがどのように機能するかはよくわかりませんが、コンストラクタ関数がある場合、インスタンス プロパティがthisコンストラクタ内または に割り当てられることを期待していると想像できますMyClass.prototype

@constructor注釈を削除して を省略した場合new、警告は表示されません (ただし、コンパイルされたコードはconsole.log("Hello World");.

于 2012-06-24T15:21:55.007 に答える