我有了形式某些功能的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() {...}}
的問題是,在瀏覽器已經支持的。名稱屬性,這將返回一個字符串「一個「如果我檢查像g_somethingSomething [我] .type.name;請注意,g_somethingSomething [i] .type.prototype.name仍然會正確包含手動分配的字符串「foo」(或「bar」,具體取決於它是哪個對象),因爲閉包編譯器不會重命名它。
在反序列化(和序列化)期間,這是有問題的,因爲當我以某種方式序列化包含對這些函數的引用的某些對象時,我將它們的名稱存儲到序列化輸出中,之後在反序列化過程中遍歷g_somethingSomething.types數組,直到我找到一個有type.name === deserializedThing.name的條目。這當然是因爲在同一網站早期版本的序列化數據中,反序列化的Thing.name可能是「foo」,並且type.name將始終是「a」。
我該如何解決這個問題?它保存(和一個標準符合的方式)只是引用type.prototype.name我以前有type.name之前?一個重要的限制是我必須正確地處理已經存在的序列化數據,這些數據中包含了舊的(未縮小的)名稱,因爲相關軟件已經出現並且用戶已經使用了相當長的一段時間。