繁体   English   中英

由于名称属性,Closure Compiler重命名麻烦

[英]Closure Compiler renaming trouble due to name property

我有一个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函数内部本地定义了它们,以便它仍可以将正确的类型分配给types数组。 因此,在调试控制台中检查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

当我以某种方式序列化包含对这些函数的引用的某些对象时,我将它们的名称存储到序列化的输出中,然后在反序列化期间遍历g_somethingSomething.types数组,直到找到具有type.name === deserializedThing.name的条目。

这听起来像个坏主意。

Function.prototype.name用于调试等,而不用于重要信息。 大多数人会使用不同的序列化数据,例如,使用显式的"type" JSON属性或类似的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM