Closure Compiler - 混淆 public 方法 - 不一致的行为?

Closure Compiler - obfuscate public methods - inconsistent behavior?

我刚开始使用 Closure Compiler,我看到一些关于混淆 public 对象方法的不一致行为。

我正在使用 grunt-closure-compiler - 这是我的 grunt 配置:

module.exports = function(grunt) {

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        'closure-compiler': {
            app: {
                closurePath: 'closure-compiler',
                js: 'src/app.js',
                jsOutputFile: 'js/app.min.js',
                maxBuffer: 500,
                options: {
                    compilation_level: 'ADVANCED_OPTIMIZATIONS',
                    language_in: 'ECMASCRIPT5_STRICT',
                    formatting: 'PRETTY_PRINT'
                }
            }
        }
    });


    grunt.loadNpmTasks('grunt-closure-compiler');

};

这里是 app.js 我想要混淆的文件:

(function() {
  /**
   * @constructor
   */
  function MyClass() {
    var map = {};
    this.put = function(name, val) {
      map[name] = val;
    };
    this.get = function(name) {
      return map[name];
    };
  }
  var mapper = new MyClass();
  mapper.put("first", 123);
  alert(mapper.get("first"));

})();

(function() {
  /**
   * @constructor
   */
  function Foo() {
    var private_member_1 = 'bla';

    this.someMethod = function(param1, param2) {
      // do some stuff
      console.log('abc');
      return private_member_1;
    };
    // etc...
  }

  var foo = new Foo();
  var value = foo.someMethod();
  console.log(value + value);
})();

这是运行grunt closure-compiler:app

之后的输出
'use strict';(function() {
  var a = new function() {
    var a = {};
    this.put = function(b, c) {
      a[b] = c;
    };
    this.get = function(b) {
      return a[b];
    };
  };
  a.put("first", 123);
  alert(a.get("first"));
})();
(function() {
  var a = (new function() {
    this.a = function() {
      console.log("abc");
      return "bla";
    };
  }).a();
  console.log(a + a);
})();

请注意,在第一个闭包中,方法 putget 没有被混淆,而在第二个闭包中,方法 someMethod 混淆了。

为什么会这样?我怎样才能使我所有 类(如 putget)中的所有 public 方法也被混淆?

请注意-

我想通了 - getput 被认为是保留字,闭包编译器故意忽略它们。 我之前 运行 浏览了这些保留字的列表,但现在找不到...如果有人将 link 发布到完整列表,我将不胜感激。

更新

从 20150315 版 Closure-compiler 开始,默认启用基于类型的优化。


这个其实在项目FAQ.

里有讲到

您想要的选项是use_types_for_optimization。这将启用 属性 重命名,即使在不相关的对象上定义了相同名称的 属性。

只能使用此标志重命名的综合属性列表非常庞大:在外部文件中的任何对象上定义的任何 属性 名称。