JavaScript の継承で Child.prototype = Parent.Prototype を避けるべき場合
JavaScript では Child.prototype = を使用して継承するのが一般的ですが、 new Parent();、Child.prototype = Parent.Prototype の場合は例外があり、意図しないエラーが発生する可能性があります。
次のスニペットを考えてみましょう:
function GameObject(oImg, x, y) { this.x = x; this.y = y; this.img = oImg; this.hit = new Object(); this.hitBox.x = x; this.hitBox.y = y; this.hitBox.width = oImg.width; this.hitBox.height = oImg.height; } Spaceship.prototype = new GameObject(); Spaceship.prototype.constructor = Spaceship; function Spaceship(){ console.log("instantiate ship"); GameObject.apply(this, arguments); this.vx = 0; this.vy = 0; this.speed = 3; this.friction = 0.94; }
Spaceship コンストラクターを調べると、その __proto__ プロパティが GameObject ではなく Spaceship を指していることがわかります。これは、次の行:
this.hitBox.width = oImg.width; this.hitBox.height = oImg.height;
が GameObject プロトタイプには存在しない this.hitBox にプロパティを直接割り当てているためです。この動作は次の理由から問題があります。
Child.prototype = new Parent(); を使用する理由代わりに
Child.prototype = new Parent(); Parent クラスのコンストラクターを呼び出し、新しく作成されたインスタンスを Child プロトタイプに割り当てます。これにより、次のことが保証されます。
代替解決策
Object.create をサポートする最新のブラウザでは、Spaceship.prototype = Object.create(GameObject.prototype); を使用できます。子プロトタイプを作成します。これは機能的には Child.prototype = new Parent(); と同等です。しかし、より簡潔であり、不必要なコンストラクター呼び出しを回避します。
以上がJavaScript の継承で「Child.prototype = Parent.Prototype」を避けるべきなのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。