2015-06-05 23 views
1

我有了形式某些功能的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之前?一個重要的限制是我必須正確地處理已經存在的序列化數據,這些數據中包含了舊的(未縮小的)名稱,因爲相關軟件已經出現並且用戶已經使用了相當長的一段時間。

回答

0

就我所知,你的問題與閉包編譯器無關。

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

console.log(foo); 

打印ctor在Chrome中,不foo如你所希望的。

當我序列含有以某種方式這些函數的引用某些對象,我存儲他們的名稱輸入到串行化輸出和後反序列化期間遍歷g_somethingSomething.types陣列,直到找到具有type.name條目= == deserializedThing.name

這聽起來像個壞主意。使用Function.prototype.name進行調試等,而不是重要的信息。大多數會以不同的方式序列化數據,例如 - 明確的"type" JSON屬性或類似的東西。