使用“类”容器对象时,Closure Compiler @extends不起作用

时间:2013-01-31 06:40:35

标签: javascript google-closure-compiler

我正在为闭包编译器注释我的所有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

into closure compiler with 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);

2 个答案:

答案 0 :(得分:6)

答案并不明显。您只需要在@const命名空间中添加Class

/** @const */
var Class = {};

答案 1 :(得分:1)

最简单的,因为你将在提前模式下编译它无论如何也许是使用goo.provide并只链接base.js。然后显然你应该使用goog.inherits继承,因为高级模式了解基础.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这样的构建系统。