[英]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.