5

私はJavascriptでOOPに頭を悩ませようとしています(他の言語でもOOPを実際に使用したことはないので、これが初めての経験です)。コンストラクターの入力を必要とするクラスを作成しましたが、コンストラクターは特別にフォーマットされた文字列でのみ機能します。

入力をチェックするために使用できる正規表現がありますが、一致しない場合(または入力がまったくない場合)に何をすべきかわかりません。ある種の例外をスローする必要がありますか?もしそうなら、どうすればそれについて行くことができますか?

4

4 に答える 4

4

JavaScriptでは、例外をスローすることはあなたがやりたいことではありません。例外は例外的にのみ発生します(ええと...)。これは、通信のためにあらゆる場所で例外が使用される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
}
于 2012-10-04T16:19:04.120 に答える
3

JavaScriptコンストラクター(newキーワードで呼び出される関数)は、常にオブジェクトを返す必要があります。返すことはできません。またはfalsenull通常どおりに呼び出された場合と同様です。したがって、2つのオプションがあります。

さらに(特に例外を使用する場合)、コンストラクターの静的プロパティとして追加の検証関数(ブール値を返す)を提供する場合があるため、オブジェクトを作成する前でもそれを使用できます。例:

function Decryption(str) {
    if (! Decryption.test(str))
        throw new SyntaxError("invalid encryption");
    this.result = decrypt(str);
}
Decryption.test = function(str) {
    return /MyCoolRegExp/.test(str);
};
于 2012-10-04T16:13:27.380 に答える
1

例外をスローする場合は、次のように実行できます。

throw new Error("Illegal construction string.");

Errorオブジェクトは必須ではありません。つまり、プレーンな文字列をスローできますが、onerrorイベントを処理するとエラーメッセージが適切に表示されます。)

ユーザー入力を使用する場合は、コンストラクターを呼び出す前に文字列を検証し、例外の結果よりもわかりやすいメッセージをユーザーに提供する必要があります。もちろん、コンストラクターで検証を行って、何も潜入していないことを確認することもできます。

于 2012-10-04T16:06:03.320 に答える
0

これを回避するには、通常2つの方法があります。例外をスローするか、失敗を示す値(などundefined)を返す方法です。JavaScriptでは、私は後者の、より寛容なアプローチに傾倒する傾向があります。

また、2番目のアプローチは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
于 2012-10-04T16:11:38.997 に答える