1

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();

在启用调试的高级模式下运行 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,它是窗口,因此是编译器警告。

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

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

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

1 回答 1

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. 一个常量命名空间。不是必需的,但改进了类型检查。
  2. 构造函数声明(引入类型名称)
  3. @lends 在对象字面量上,表示属性正在类型声明中使用。

@lends 在这里是必要的,因为闭包编译器没有内置关于 Moo 工具类声明的任何特定知识,您需要帮助它了解它被用作类型定义的一部分。

于 2013-07-30T15:20:09.543 回答