1

バニラのJavaScriptも使用しているため、クロージャーがすべてのシンボルの名前を変更しないように、JavaScriptに注釈を付けようとしています。

/**
* @constructor
* @expose
* @type{foo}
*/

foo = function (el, args) {
"use strict";
var s = "Hello World";
/*
* @expose
* @this {foo}
* @type {function}
*/
this.introduce = function () {
    return s;
 };
};

ただし、高度な最適化を使用してクロージャーコンパイラーを実行すると生成される出力は

foo = function() {
 this.a = function() {
 return"Hello World"

} };

これは外部の JavaScript から呼び出されるため、introduced という名前を保持するようクロージャーに依頼するにはどうすればよいですか。

4

1 に答える 1

4

次のオプションを使用して、ClosureCompilerがシンボルの名前を変更しないようにすることができます。

  • @exportgoog.exportSymbolまたはを参照goog.exportProperty
  • 文字列によって参照されるグローバルオブジェクトにシンボルを格納することにより、シンボルをエクスポートします。保持したいシンボルのエクスポートを参照してください
  • externsファイルでインターフェースを定義し、インターフェースを実装します(以下のリンクされた回答を参照)
  • プロパティを引用
  • 注: @expose非推奨になりました

例に示すように関数プロトタイプでメソッドを定義したくない場合は、でコンストラクターfooをエクスポートし、メソッドのエクスポートgoog.exportSymbol に使用でき@exposeます。

/**
 * @param {Element} el
 * @param {...*} args
 * @constructor
 */
var foo = function (el, args) {
  "use strict";

  /** @private */
  this.msg_ = "Hello World";

  /**
   * @this {foo}
   * @return {string}
   * @expose
   */
  this.introduce = function () {
    return this.msg_;
  };
};
goog.exportSymbol('foo', foo);

関数プロトタイプでメソッドを定義することによりgoog.exportSymbol、コンストラクターとメソッド名の両方をエクスポートするために使用できます。

/**
 * @param {Element} el
 * @param {...*} args
 * @constructor
 */
var foo = function (el, args) {
  "use strict";

  /** @private */
  this.msg_ = 'Hello World!';
};
goog.exportSymbol('foo', foo);

/**
 * @return {string}
 */
foo.prototype.introduce = function () {
  return this.msg_;
};
goog.exportSymbol('foo.prototype.introduce', foo.prototype.introduce);

これらの関連するstackoverflowの質問を参照してください:

于 2012-07-27T05:45:23.960 に答える