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
ポイント。これは私にとって問題です。コンストラクターが他の方法で公開されていないための回避策として、インスタンスを介してコンストラクターにアクセスしようとしています。しかし、リフレクション/回避策のハッキングのために属性にアクセスすることは別として、最初のフォームは重大な問題を引き起こしますか?Object
Ninja
constructor
Ninja.prototype
隠されている可能性のあるオリジナルの他の重要な属性はありますか? 最初の形式では、型の継承や共通ライブラリで問題が発生しますか?
私は、これが異常ではあるが受け入れられる Javascript パターンなのか、それとも実際には一般的な Javascript の失敗または「落とし穴」であり、バグと見なすべきなのかを理解しようとしています。
私の例は、John Resig によるチュートリアルのサンプル コードNinja
に基づいていることに注意してください。問題の実際の型は と呼ばれず、より長く複雑です。Ninja
また、このコンストラクターとプロトタイプのガイドを読んで、たとえば、プロトタイプが属性検索でどのように使用されているか、なぜ isinstanceof
まだ機能するのかを理解しました。