2014-01-19 226 views
0

我正在慢慢理解JavaScript的微妙之處。在這個時候,我試圖實例化一個JavaScript錯誤對象的實例。我知道我可以做到以下幾點:實例化JavaScript錯誤對象實例

var error = new Error('The value is invalid'); 
error.name = 'ArgumentException'; 
throw error; 

不過,我想弄清楚/明白,如果有向下凝結這個實例化一個單行的方式。舉例來說,我想要做像下面這樣:

var error = new Error().{ message:'The value is invalid', name:'ArgumentException'}; 
throw error; 

是否有可能實例化的JavaScript Error對象的實例,同時設置兩個消息和名稱的屬性?

謝謝!

+0

'name'屬性是從'Function'繼承的,所以在我知道實例化'Error'對象時不能直接設置它。 – adeneo

+0

爲什麼會將這個凝聚成一條線使它更好?看看文檔https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error – Adam

+2

對於單線程,最接近你會得到類似'throw(function(){var 0 = new Error(「Whoops! ); e.name ='ArgumentException'; return e; })();' – adeneo

回答

0

前段時間,我沿着Mozilla的建議創建了一個自定義的Error對象。基本上它以OO方式創建對象(請注意prototypeconstructor)。注意有一定的侷限性(類型特定catches;閱讀我下面提到的資源):

// Create a new object, that prototypilly inherits from the Error constructor. 
function MyError(message) { 
    this.name = "MyError"; 
    this.message = message || "Default Message"; 
} 
MyError.prototype = new Error(); 
MyError.prototype.constructor = MyError; 

try { 
    throw new MyError(); 
} catch (e) { 
    console.log(e.name);  // "MyError" 
    console.log(e.message); // "Default Message" 
} 

try { 
    throw new MyError("custom message"); 
} catch (e) { 
    console.log(e.name);  // "MyError" 
    console.log(e.message); // "custom message" 
} 

欲瞭解更多信息: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Error

Mozilla的網頁是指以下問題(你必須注意事項知道): What's a good way to extend Error in JavaScript?

+0

這對較大的代碼庫很有用。顯示在邊欄中的鏈接答案會在構造函數中添加調用原始類,並且IMO值得閱讀:http://stackoverflow.com/a/1382129/3150057 –

1

您可以將error.name分配在與投擲它相同的線上。

如果賦值的右邊是一個真值(你的是一個非空字符串),那麼賦值語句就是truthy,這意味着你可以用&&運行。最後一個truthy語句將在線路開始時發送回throw並將被拋出。

var error = new Error('The value is invalid'); 
throw (error.name = 'ArgumentException') && error; 

沒有與name設置爲ArgumentException的創建自己的錯誤類,這是因爲一些觀點,你可以得到不使用的立即調用函數表達式(IIFE)有一個塊語句

編輯:adeneo正確使用了一個語句的IIFE,即使它包含多個語句作爲一個塊。我已經編輯了我的最後一段來包含這一點。

0

如果你真的想在一行中的一切,你可以這樣做

var error = Object.defineProperty(new Error('The value is invalid'), 'name', {value: 'ArgumentException'}); 

你也可以把它放在同一行

throw Object.defineProperty(new Error('The value is invalid'), 'name', {value: 'ArgumentException'}); 

我真的不喜歡的怎麼樣它看起來像,但我想這回答你的問題。