2014-01-19 197 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'}); 

我真的不喜欢的怎么样它看起来像,但我想这回答你的问题。