私は次のように機能するコンストラクターでパターンを見てきました:
function Animal(name) {
if ( !(this instanceof Animal) ) {
return new Animal(name);
}
this.name = name;
}
または、より一般的な形式:
function Animal(name) {
if ( !(this instanceof arguments.callee) ) {
return new arguments.callee(name);
}
this.name = name;
}
そのため、誤っAnimal()
てキーワードなしで呼び出された場合でも、コード内で呼び出すことで機能します。しかし、なぜ悪い呼び出しコードを許容するのだろうか?次の方が望ましいのではないでしょうか。new
new Animal(name)
function Animal(name) {
if ( !(this instanceof Animal) ) {
// throw an exception, alert, or console.log or console.error
}
this.name = name;
}
プログラマーが呼び出し元のコードをすぐに修正できるようにします。
しかし、私はそれぞれのアプローチについて疑問に思います、もし
- 例外がキャッチされたが、コールスタックのあるレベルで無視された場合はどうなりますか?
- それがアラートであり、1000回実行されるループ内にあり、ブラウザがユーザーにこれ以上アラートを表示しないことを選択させる方法がない場合、アラートは1000回ポップアップします。
- console.logまたはconsole.error...プログラマーがコンソールを開いていない場合はどうなりますか?そうすると、バグがすり抜けて本番サーバーにプッシュされる可能性があります。
1つの方法はJSLintを使用することかもしれませんか?しかし、コードにすでに数千行があり、JSLintに多くの警告が表示されていて、現時点ですべての警告を修正できない場合は、現時点でコンストラクターを適切に実装するための良い方法は何でしょうか。