如何告诉闭包编译器保留对象的属性

use*_*421 2 google-closure-compiler

我有一个这样声明的对象:

my.namespace.FEATURES = {
    FIRST_FEATURE = "first feature",
    SECOND_FEATURE = "second feature"
};
Run Code Online (Sandbox Code Playgroud)

my.namespace.my.object用来跟踪我的代码中可用/实现的功能类型。每个新发布的版本都会有一组经过修改的功能。使用我的最小化代码的第三方会想知道他们在他们拥有的版本中可以做什么,所以我提供了以下导出的函数,以便他们知道他们可以做什么。

my.namespace.hasFeature = function(feature) {
    for(var prop in my.namespace.FEATURES) {
        if(my.namespace.FEATURES[prop] == feature) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

问题是当我运行 Closure Compiler 时属性被重命名。

我的问题是:保留这些属性的最佳方法是什么?我知道我可以导出该属性,但由于某种原因感觉有点脏。是否有 Closure 最佳实践来保留对象的属性?

Dun*_*can 5

Closure Compiler 具有 JavaDoc 样式标记...
这是引用标记的页面:为 Closure Compiler 注释 JavaScript
要保留字段名称,请将其放在/** @expose */字段声明之前。

my.namespace.FEATURES = {
    /**@expose*/
    FIRST_FEATURE: "first feature",
    /**@expose*/
    SECOND_FEATURE: "second feature"
};
Run Code Online (Sandbox Code Playgroud)

...如果您需要保留命名空间,这是相同的概念...

/**@expose*/
my = my || {};
/**@expose*/
my.namespace = my.namespace || {};
/**@expose*/
my.namespace.FEATURES = {
    /**@expose*/
    FIRST_FEATURE: "first feature",
    /**@expose*/
    SECOND_FEATURE: "second feature"
};
Run Code Online (Sandbox Code Playgroud)

除了保留字段名称之外,它还允许您稍后在代码中使用点符号引用该字段。使用obj["field"],如果您obj.field稍后调用它而不是必须使用字符串,编译器将丢失引用。