2

私は次のように機能するコンストラクターでパターンを見てきました:

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()てキーワードなしで呼び出された場合でも、コード内で呼び出すことで機能します。しかし、なぜ悪い呼び出しコードを許容するのだろうか?次の方が望ましいのではないでしょうか。newnew Animal(name)

function Animal(name) {
    if ( !(this instanceof Animal) ) {
        // throw an exception, alert, or console.log or console.error
    }
    this.name = name;
}

プログラマーが呼び出し元のコードをすぐに修正できるようにします。

しかし、私はそれぞれのアプローチについて疑問に思います、もし

  1. 例外がキャッチされたが、コールスタックのあるレベルで無視された場合はどうなりますか?
  2. それがアラートであり、1000回実行されるループ内にあり、ブラウザがユーザーにこれ以上アラートを表示しないことを選択させる方法がない場合、アラートは1000回ポップアップします。
  3. console.logまたはconsole.error...プログラマーがコンソールを開いていない場合はどうなりますか?そうすると、バグがすり抜けて本番サーバーにプッシュされる可能性があります。

1つの方法はJSLintを使用することかもしれませんか?しかし、コードにすでに数千行があり、JSLintに多くの警告が表示されていて、現時点ですべての警告を修正できない場合は、現時点でコンストラクターを適切に実装するための良い方法は何でしょうか。

4

2 に答える 2

1

newキーワードがいたるところに散らばっているのが嫌いです。標準的な規則に従って、通常の関数と区別するためにすべてのクラス名を大文字で始めます。

jQuery は、これらをすべてのコンストラクター関数 (例: Event) で広範囲に使用します。
はるかにエレガントなコードになると思います。


PS使用しないでくださいarguments.callee。非推奨になりました。

于 2012-11-12T02:18:27.213 に答える
1

new本当の問題は、コンストラクターが必要なときに呼び出されないことに対処する方法のようです。明らかな答えがあります:

  1. ECMAScript ed 3 用に作成しますが、開発には厳密モードを使用して、ほとんどの (必ずしもすべてではありません) そのようなエラーがすぐに検出されるようにします。現在 Web 用に作成されているほとんどのコードは、strict モードと non-strict モードの両方で実行する必要があります。

  2. 徹底的な単体テストを使用する

  3. リンターを使う

コンストラクターによって返されたオブジェクトが実際にはインスタンスではなくグローバル オブジェクトである場合、コードがテストに合格した場合、テストがゴミであるか、そもそもコンストラクターを使用するべきではなかったようです。

ほとんどの場合、javascript でコンストラクターを使用する必要はありません。

于 2012-11-12T03:10:36.690 に答える