重新格式化javascript以适应google-closure-compiler的命名空间展平

时间:2013-07-26 20:18:30

标签: javascript performance mootools google-closure-compiler yui-compressor

高级模式下的google-closure-compiler,警告以下代码。这是由名称空间展平引起的。

var com.my.test.namespace = {};
com.my.test.namespace.a = new Class ({
    name : "test",
    initialize : function() {   //constructor
        alert(this.name);
    }
});

com.my.test.namespace.a();

在启用调试的ADVANCED模式下运行google-closure-compiler时,com.my.test.namespace.a将替换为com $ my $ test $ namespace $ a

因此,缩小的代码大致如下,

var com.my.test.namespace = {};
com$my$test$namespace$a = new Class ({
    name : "test",
    initialize : function() {   //constructor
        alert(this.name);
    }
});

com$my$test$namespace$a();

当调用com $ my $ test $ namespace $ a()时,“this”不再是com.my.test.namespace,它是窗口,因此是编译器警告。

一些文档建议用com.my.test.namespace.a替换“this”来解决这个问题。但是,这是正确的做法吗? com.my.test.namespace.a.name指向什么?它肯定不像当前实例“名称”属性。

这样做的正确方法是什么? com.my.test.namespace.a.prototype.name?

PS:
I am using mootools library for the Class method.

1 个答案:

答案 0 :(得分:2)

如果initialize是构造函数,那么“this”应该是类型名称而不是命名空间。以下是如何为编译器注释它

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

/** @constructor */
namespace.a = new Class (/** @lends {namespace.a.prototype} */{
    name : "test",
    initialize : function() {
        alert(this.name);
    }
});

new namespace.a();

这就是我所拥有的:

  1. const命名空间。不是必需的,但改进了类型检查。
  2. 构造函数声明(引入类型名称)
  3. @lends on object literal,表示属性正在类型声明中使用。
  4. @lends在这里是必要的,因为Closure Compiler没有关于Moo工具的类声明的任何特定知识,你需要帮助它理解它被用作类型定义的一部分。