高级模式下的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.
答案 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();
这就是我所拥有的:
@lends在这里是必要的,因为Closure Compiler没有关于Moo工具的类声明的任何特定知识,你需要帮助它理解它被用作类型定义的一部分。