我正在尝试用 Javascript 了解 OOP(我也从未真正在任何其他语言中使用过 OOP,所以这是我的第一次体验)。我编写了一个需要为构造函数输入的类,但构造函数仅适用于特定格式的字符串。
我有一个正则表达式,我可以用它来检查输入,但我不知道如果它不匹配(或者根本没有输入)我应该做什么。我应该抛出某种异常吗?如果是这样,我该怎么做?
我正在尝试用 Javascript 了解 OOP(我也从未真正在任何其他语言中使用过 OOP,所以这是我的第一次体验)。我编写了一个需要为构造函数输入的类,但构造函数仅适用于特定格式的字符串。
我有一个正则表达式,我可以用它来检查输入,但我不知道如果它不匹配(或者根本没有输入)我应该做什么。我应该抛出某种异常吗?如果是这样,我该怎么做?
在 JavaScript 中,抛出异常并不是你想要做的。一个异常只能在异常情况下发生(duh ...)。这与 Java 形成鲜明对比,Java 中到处都使用异常来进行通信。造成这种差异的原因是 JS 中的异常处理非常慢。
因此,您可以很好地为您的构造函数配备throw
,但这不应该在生产中被捕获。您宁愿先在构造函数之外检查有效性。
做:
if (validRE.test(input)) {
foo = new MyObject(input);
} else {
// show message to the user
}
不:
try {
foo = new MyObject(input);
} catch (ex) {
// show message to the user
}
JavaScript 构造函数(使用new
关键字调用的函数)总是需要返回一个对象,你不能 return false
,null
或者类似正常调用时。所以,你有两个选择:
throw
语句中的每个 javascript 值执行此操作。然后,用try
语句将它们捕获到构造之外invalid
指针。例如,Date
构造函数执行此操作,获取属性然后生成NaN
s。此外(特别是在使用异常时),您可能会提供额外的验证函数(返回布尔值)作为构造函数的静态属性,因此您甚至可以在构造对象之前使用它。例子:
function Decryption(str) {
if (! Decryption.test(str))
throw new SyntaxError("invalid encryption");
this.result = decrypt(str);
}
Decryption.test = function(str) {
return /MyCoolRegExp/.test(str);
};
如果你想抛出一个异常,你可以这样做:
throw new Error("Illegal construction string.");
(该对象不是强制性的,即您可以抛出一个纯字符串,但如果您处理该事件Error
,它将使错误消息很好地显示出来。)onerror
当您将使用用户输入时,您可能会在调用构造函数之前验证字符串,并为用户提供比异常结果更友好的消息。当然,您仍然可以在构造函数中进行验证,以确保没有任何东西偷偷溜走。
通常有两种方法可以解决这个问题:要么抛出异常,要么返回一些指示失败的值(如undefined
)。在 JavaScript 中,我倾向于更倾向于后者,更宽容的方法。
我还发现第二种方法更接近地模仿了很多 JavaScript 本身。例如,在 Python 中,如果您尝试访问对象上不存在的属性,则会引发异常。
>>> foo = 0
>>> foo.idontexist
AttributeError: 'int' object has no attribute 'idontexist'
而在 JavaScript 中,它只返回undefined
.
> var foo = 0;
> foo.idontexist
undefined
许多函数和对象也以这种方式工作。例如,在传递不正确的日期字符串时Date
返回一个Invalid Date
对象,而不是引发异常。
> var foo = new Date('thisisnotadate');
> foo
Invalid Date