【问题标题】:closure compiler - keeping inner properties and not outer objects闭包编译器 - 保留内部属性而不是外部对象
【发布时间】:2014-10-02 22:26:48
【问题描述】:

我有这样的结构:

// this is an object I instantiate elsewhere like var l=new Layer()
function Layer() {

       // exported members
       this.function1=function() {....}
       .
       .
       .
       this.function1000=function() {....}
       .
       .
       // private property
       var keepPropertyNames={

             keepMe1:4,
             keepMe2:2,
             keepMe3: {
                  keepMe31:4,
                  keepMe32:4,
                  keepMe33:4,
             } 
       }

}

我如何告诉闭包编译器 - 高级模式 - 重命名所有内容,包括 Layer 类及其导出的成员,而不是内部 keepPropertyNames 对象中的属性?我将如何声明 externs?

提前感谢。

【问题讨论】:

    标签: javascript google-closure-compiler


    【解决方案1】:

    不要混淆外部和导出。

    • Externs 用于定义您在代码中使用的其他库的类型。
    • 导出是为了防止您的代码被重命名,以便在其他地方使用。

    选项 1

    处理此问题的最简单方法是引用属性名称:

    // private property
    var keepPropertyNames={
         "keepMe1":4,
         "keepMe2":2,
         "keepMe3": {
              "keepMe31":4,
              "keepMe32":4,
              "keepMe33":4,
         } 
    }
    

    闭包编译器不会重命名引用的属性。

    选项 2

    声明一个包含所有可能类型的外部接口。这可以作为记录类型来完成:

    外部

    /** @typedef {{
     *      keepMe1: number,
     *      keepMe2: string,
     *      keepMe3: Object.<string, number>
     *    }}
     */
     var KeepPropertyNamesRecord;
    

    来源

    /** @type {KeepPropertyNamesRecord} */
    var keepPropertyNames={
         keepMe1:4,
         keepMe2:2,
         keepMe3: {
              "keepMe31":4,
              "keepMe32":4,
              "keepMe33":4,
         } 
    }
    

    您还必须声明子对象的类型,例如 keepMe3

    【讨论】:

    • 所以我的问题是,keepPropertyNames 是增量初始化的,即在应用程序的生命周期内,每个对象都会有一个具有不同属性的keepPropertyNames 对象。有大约 50 种不同的属性,对象通常有 1-5 个。我可以使用 keepPropertyNames 初始化根对象,并声明所有可能的属性,然后删除它们吗? (我对具有所有可能属性的所有对象不感兴趣)
    • 只要你总是使用带引号的属性名(通过keepPropertyNames["keepMe1"]访问),那么你就不需要初始化它们。您也可以删除它们。
    • 问题是,代码就像 60,000 行 javascript 和数百个文件......我很少用引号访问它们(总是尽量避免 xDD)。我没有进行如此大的更改,而是考虑在开头用引号初始化所有可能性,然后删除该属性。你认为这可行吗?
    • 否 - 您必须始终如一地引用引用或未引用的属性。让我扩展答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多