3

我正在为闭包编译器注释我的所有 javascript,但是 - 我目前拥有的代码很大程度上取决于在对象中定义类,即:

Class.SomeClass = function() {};
Class.SomeOtherClass = function() {};

而不是:

function SomeClass() {};
SomeClass.prototype = {};

但是,它在尝试注释扩展时给了我一个警告……编译器指出我无法确定 Class.SomeClass 是什么类型:

JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type Class.SomeObject 
*  @extends Class.SomeObject

使用 ADVANCED_OPTIMIZATIONS将以下代码粘贴到闭包编译器中

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

(function($) {

    "use strict";

    var Class = {};

    /**
     *  @constructor
     */
    Class.ObjectA = function() {};
    Class.ObjectA.prototype = {};

    /**
     *  @constructor
     *  @extends Class.ObjectA
     */
    Class.ObjectB = function() {};
    Class.ObjectB.prototype = $.extend(new Class.ObjectA(), {
        initialize: function() {}
    });


    window.test = new Class.ObjectB();
    window.test.initialize();

})(jQuery);
4

2 回答 2

6

答案并不明显。您只需要添加一个@const到您的Class命名空间。

/** @const */
var Class = {};
于 2013-01-31T11:56:00.210 回答
1

好吧,最简单的,因为无论如何您都将在提前模式下编译它,所以可能使用 goo.provide 并将 base.js 链接进去。那么显然您应该使用 goog.inherits 进行继承,因为高级模式了解 base.js 功能比说 $.extends 好多了。

所以我实现相同的代码如下所示:

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @use_closure_library true
// ==/ClosureCompiler==

goog.provide('Class.ObjectA')

/**
*  @constructor
*/
Class.ObjectA = function() {};

goog.provide('Class.ObjectB');
/**
*  @constructor
*  @extends Class.ObjectA
*/
Class.ObjectB = function() {};
Class.ObjectB.prototype =
{
    initialize: function() {}
}

goog.inherits(Class.ObjectB, Class.ObjectA);


window.test = new Class.ObjectB();
window.test.initialize();

在编译器 ui 中,您必须选择添加将添加 goog.base 的闭包库的选项。

现在你的方法中也有几个 jqueury 风格的 foo,比如 (function($) {})(jQuery); 如果您开始使用高级编译路线,我会重新评估它的使用(我个人会重新评估 jquery 与闭包库的使用,但我确实知道有人继续使用高级的 jquery)。进入高级模式我还建议您查看像 plovr 这样的构建系统。

于 2013-01-31T07:06:00.483 回答