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



我有一个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;注意g_somethingSomething[i].type.prototype.name仍然会正确地包含我在手动赋值的字符串"foo"(或"bar",取决于它是哪个对象),因为闭包编译器不会重命名它。

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

我该如何着手解决这个问题?它是保存(和标准的遵从方式),只是引用类型。原型。名称,我之前有类型。名称的地方?一个重要的限制是,我必须正确地处理已经存在的序列化数据,这些数据中包含了旧的(未缩小的)名称,因为相关的软件已经问世,用户已经使用它很长一段时间了。

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

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

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

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

听起来不是个好主意。

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

最新更新