3

Javascript タイプを定義するために次のようなことを行う別の開発者のコ​​ードに出くわしました。

function Ninja() {}
Ninja.prototype = {
  swingSword: function(){
    return true;
  }
}

より従来の方法が次のような場合:

function Ninja() {}
Ninja.prototype.swingSword = function() {
    return true;
}

swingSword 最初の形式は、新しいインスタンスを作成してメソッドを呼び出すことができ、instanceof正確であるという点でほとんど機能します。

var ninja = new Ninja();
ninja.swingSword(); // returns true
ninja instanceof Ninja; // also true

ただし、機能ではなくninja.constructorポイント。これは私にとって問題です。コンストラクターが他の方法で公開されていないための回避策として、インスタンスを介してコンストラクターにアクセスしようとしています。しかし、リフレクション/回避策のハッキングのために属性にアクセスすることは別として、最初のフォームは重大な問題を引き起こしますか?ObjectNinjaconstructor

Ninja.prototype隠されている可能性のあるオリジナルの他の重要な属性はありますか? 最初の形式では、型の継承や共通ライブラリで問題が発生しますか?

私は、これが異常ではあるが受け入れられる Javascript パターンなのか、それとも実際には一般的な Javascript の失敗または「落とし穴」であり、バグと見なすべきなのかを理解しようとしています。

私の例は、John Resig によるチュートリアルのサンプル コードNinjaに基づいていることに注意してください。問題の実際の型は と呼ばれず、より長く複雑です。Ninja

また、このコンストラクターとプロトタイプのガイドを読んで、たとえば、プロトタイプが属性検索でどのように使用されているか、なぜ isinstanceofまだ機能するのかを理解しました。

4

1 に答える 1