javascript - 由于名称属性,闭包编译器重命名问题

标签 javascript google-closure-compiler

我有一个 JS 文件,其中包含表单中的一些函数

var foo = (function() {
   function ctor(){
          ...
   };
   ctor.prototype.name = "foo"

   return ctor;
})()
var bar = (function() {... the same here... })()

我手动给它们命名,因为有些浏览器还不支持 function.name ,并且由于序列化和反序列化,我需要一些东西来引用该函数。这也是我有以下内容的原因:

在同一个文件的其他地方,我有一个引用这些函数的数组,如下所示:

var g_somethingSomething = (function() {
 function ctor(){
      this.foo = foo; //this.foo references the global foo function
      this.bar = bar; //these two this.xxx references are just there so while debugging you can type g_somethingSomething.xxx directly instead of having to type g_somethingSomething.types[figureOutThisIndex].creator

      this.types= [
        {type: foo, creator: this.foo},
        {type: bar, creator: this.bar}
      ];
 };

 return ctor;

})();

我根本不是一个经验丰富的 JS 开发人员,所以如果这对你们中的一些人来说非常丑陋,我不会感到惊讶。然而,关于问题:

当我使用闭包编译器的简单模式对此进行缩小时,它将本示例中的两个函数重命名为“a”,并在 g_somethingSomething 函数内部本地定义它们,以便它仍然可以将正确的类型分配给类型数组。因此,在调试控制台中检查时,g_somethingSomething.types 数组中的所有条目都将具有如下所示的对象:

{ type: function a(){...},  creator: function a() {...}}

问题是,在已经支持 .name 属性的浏览器上,如果我检查类似 g_somethingSomething[i].type.name; 的内容,这将返回字符串“a”;请注意, g_somethingSomething[i].type.prototype.name 仍将正确包含我在手动分配的字符串“foo”(或“bar”,具体取决于它是哪个对象),因为闭包编译器不会重命名它。

这在反序列化(和序列化)期间是有问题的,因为当我序列化某些以某种方式包含对这些函数的引用的对象时,我将它们的名称存储到序列化输出中,然后在反序列化期间遍历 g_somethingSomething.types 数组,直到找到具有 type.name === deserializedThing.name 的条目。这当然会破坏,因为在同一网站的早期版本的序列化数据中,deserializedThing.name 可能是“foo”,而 type.name 将始终是“a”。

我该如何解决这个问题?是否可以保存(以及标准的符合方式)只在我之前有 type.name 的地方引用 type.prototype.name ?一个重要的限制是,我必须正确处理现有的序列化数据,其中包含旧的(未缩小的)名称,因为相关软件已经在野外使用,并且用户已经使用它相当长一段时间了。

最佳答案

据我所知,您的问题与闭包编译器无关。

var foo = (function() {
   function ctor() { };
   ctor.prototype.name = 'foo'
   return ctor;
})()

console.log(foo);

在 Chrome 中打印 ctor,而不是如您所希望的 foo

when I serialize certain objects which contain references to these functions in some way, I store their name into the serialized output and later during deserialization traverse the g_somethingSomething.types array until I find an entry which has type.name === deserializedThing.name

这听起来是个坏主意。

使用Function.prototype.name进行调试等,而不是获取重要信息。大多数人会以不同的方式序列化您的数据,例如使用显式的 "type" JSON 属性或类似的东西。

关于javascript - 由于名称属性,闭包编译器重命名问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30672672/

相关文章:

javascript - Closure Compiler 将 < 替换为\x3c

javascript - 无法使用从 GraphQL Codegen 类型导入的枚举值

js文件中的php Wordpress

javascript - 我可以用 .data("...

google-closure-compiler - 闭包编译器依赖计算比closurebuilder.py慢得多

javascript - 我如何告诉 Closure javascript 编译器不要混淆 webkitAudioContext 的方法名称?

javascript - 在 JSX Render for React.js 中迭代 JSON 响应

javascript - 如何部分更新 DynamoDB 表?

java - 在 Linux 上设置 Closure Compiler 的好方法是什么?或者,Java .jar 在 Linux 上应该放在哪里?

javascript - jQuery使用哪些工具来压缩其源代码