2012-10-09 63 views
3

我有一個函數,其中有一個構造函數。它創建了一個新的對象,並返回它:防止uglifyjs重命名某些功能

function car() { 
    function Car() {} 
    return new Car(); 
} 

結果醜化重命名汽車的一些信件,當它返回它看起來像對象名稱只是一些字母。例如在chrome中,它會說對象的類型是「t」。

有沒有辦法告訴uglify保存一些函數的名字?

+1

爲什麼這麼重要?僅用於調試目的?無論如何你都不應該使用醜化的版本進行調試。 –

+0

我會說它比其他任何東西都更具語義。如果您將圖書館暴露給人,他們應該知道他們正在處理的是什麼類型的對象。 – Parris

+0

它如何幫助知道構造函數的名稱是'Car'?它看起來像你試圖保持它的私人,所以你的庫的用戶應該不需要知道什麼是構造函數的名稱。如果它是一個公共對象,則不需要在函數中聲明它。 –

回答

9

您需要使用reserved-names參數:即使你跟着比爾的建議

--reserved-names 「Car」 
6

,還是有你的方法有問題。

car().constructor !== car().constructor 

人們會想到那些等於

我會改變你的方法來創建一個構造函數,給它一個工廠構造

/** @private */ 
function Car() { 
    ... 
} 

Car.create = function() { 
    return new Car(); 
} 

或者以下(模塊模式),並結合比爾的做法。那麼你每次都不會返回一個具有不同原型的物體

var car = (function() { 
    function Car() {...} 
    return function() { 
     return new Car(); 
    } 
})(); 

// car().constructor === car().constructor // true 
+0

我想我是這樣做的,除了在最後返回一個函數:https://github.com/parris/iz/blob/master/iz.js#L388,爲什麼返回function(){return new Car (); }爲什麼不直接返回一輛新車呢? – Parris

+3

@Parris因爲這樣,每次調用'car()'時都不會創建一個新的構造函數'Car'。自調用函數將構造函數放入閉包中,並且每次都使用相同的構造函數。你的例子每次重新聲明'函數Car(){}' –

+0

啊你是對的。謝謝。 – Parris