6

変数または関数の上にコメントを入れると、@private実際に何をしているのでしょうか。ドキュメントを見ましたが、まだわかりません。

goog.provide('myproject');

/** @private */
myproject.foo = "bar";

Chromeの開発ツール(myproject.foo)を開いても、引き続きアクセスできます。と...

goog.require('myproject');

window.addEventListener('load', function() {
    //this works.
    document.body.textContent = myproject.foo;
});

上記のコードは、コンパイルされた場合でも、bodytextContentを「bar」と等しくなるように設定します。では、@private実際には何をするのでしょうか?

4

2 に答える 2

6

アクセス制御アノテーション、、、@privateおよび@protectedは、@public開発者がプロ​​パティと関数に必要なレベルの可視性を適用するのに役立つClosureCompilerのディレクティブです。

アクセス違反の警告を出すには、コンパイラフラグを使用します。

  • --jscomp_warning = visibility

アクセス違反のエラーを発行するには、コンパイラフラグを使用します。

  • --jscomp_error = visibility

アクセス制御の注釈はファイルごとに適用されます。つまり、注釈が付けられているか、同じファイル内のどこからでもアクセスできるプロパティ@private@protectedあります。また、これらの注釈はJavaScript言語の一部ではないため、コンパイラーはコンパイルされたコードからこれらの注釈を削除することに注意してください。

file1.js

goog.provide('ns1');

/**
 * Global private variable.
 * @private
 */
ns1.global = 'foo';
alert('ns1.global = ' + ns1.global); // OK in same file.


/** @constructor */
ns1.Constructor = function() {
  /** @private */
  this.secret_ = ns1.global;
};

ns1.instance = new ns1.Constructor();
alert(ns1.instance.secret_); // No warning in same file.

file2.js

goog.provide('ns2');

goog.require('ns1');

alert('ns1.global = ' + ns1.global); // Not allowed.

ns2.instance2 = new ns1.Constructor();
alert(ns2.instance2.secret_); // Not allowed.

フラグ--jscomp_error=visibilityを設定すると、ClosureCompilerは次のエラーを発行します。

ERROR - Access to private property global of ns1 not allowed here.
alert('ns1.global = ' + ns1.global);
                        ^
ERROR - Access to private property secret_ of ns1.Constructor not allowed here.
alert(ns2.instance2.secret_);
      ^

Google JavaScriptスタイルガイドの可視性(プライベートフィールドと保護フィールド)を参照してください。

于 2012-07-06T21:55:14.117 に答える
1

cpeisertは彼の回答でこれを暗示していますが、明確にするために、これらの可視性アノテーションは出力をまったく変更しません。

関数を@privateとしてマークしても、関数が非表示になったり、コンパイラーが通常行うよりも結果のコードでアクセスしにくくなったりすることはありません。実行時に導入するサードパーティのコードは、そのような関数を呼び出すことができます。

これらのアノテーションによって提供される唯一のアクセス保護は、アノテーションを使用してコンパイルするコードに対するものです。

于 2012-07-09T10:13:07.840 に答える