我应该如何处理 JavaScript 中对象构造函数的无效输入

Gre*_*zzo 5 javascript oop exception class throw

我试图在 Javascript 中了解 OOP(我也从未真正在任何其他语言中使用过 OOP,所以这是我的第一次体验)。我编写了一个需要构造函数输入的类,但构造函数仅适用于特定格式的字符串。

我有一个正则表达式可以用来检查输入,但我不知道如果它不匹配(或者根本没有输入)我应该怎么做。我应该抛出某种异常吗?如果是这样,我该怎么做?

use*_*621 6

在 JavaScript 中,抛出异常不是您想要做的。异常只会在异常情况下发生(呃......)。这与 Java 形成鲜明对比,Java 中到处都使用异常来进行通信。造成这种差异的原因是 JS 中的异常处理非常慢。

因此,您可以很好地为您的构造函数配备 a throw,但这不应该在生产中被捕获。您宁愿首先在构造函数之外检查有效性。

做:

if (validRE.test(input)) {
    foo = new MyObject(input);
} else {
    // show message to the user
}
Run Code Online (Sandbox Code Playgroud)

不:

try {
    foo = new MyObject(input);
} catch (ex) {
    // show message to the user
}
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 3

JavaScript 构造函数(使用new关键字调用的函数)始终需要返回一个对象,您不能 return falsenull或者与正常调用时类似。所以,你有两个选择:

  • 从中抛出异常。throw您可以对语句中的每个 javascript 值执行此操作。然后,用声明将他们抓到建筑外面try
  • 返回一个普通对象,但内部值设置为invalid指针。例如,构造Date函数会执行此操作,获取属性然后生成NaNs。

此外(特别是在使用异常时),您可以提供额外的验证函数(返回布尔值)作为构造函数的静态属性,因此您甚至可以在构造对象之前使用它。例子:

function Decryption(str) {
    if (! Decryption.test(str))
        throw new SyntaxError("invalid encryption");
    this.result = decrypt(str);
}
Decryption.test = function(str) {
    return /MyCoolRegExp/.test(str);
};
Run Code Online (Sandbox Code Playgroud)