使用闭包编译器在对象上公开动态创建的函数

时间:2012-07-27 03:31:41

标签: google-closure-compiler google-closure-library

我正在尝试注释我的javascript,因此闭包不会重命名所有符号,因为我也在使用vanilla 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调用。

1 个答案:

答案 0 :(得分:4)

以下选项可用于防止Closure Compiler重命名 符号:

如果您不想在函数原型上定义方法,如您所示 例如,您可以使用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问题: