タイトルは少し漠然としていますが、正直なところ、この問題の解決策を理解していないと、それ以上にうまく定義することはできません。
状況
私は、javascript のプロトタイプと継承に頭を悩ませようとしています。ユース ケースは、単一のベース タイプ「A」です。そして単一のサブタイプ「B」。この問題を示す最も単純なコードの例を次に示します。動作中のバージョンはここで見ることができます。
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function A () {
this.node = document.createElement('div');
this.node.innerHTML = 'A';
}
A.prototype.show = function () {
document.body.appendChild(this.node);
}
function B () {
this.node.innerHTML = 'B';
}
B.prototype = new A();
B.prototype.constructor = B;
function make_a () {
(new A()).show();
}
function make_b () {
(new B()).show();
}
</script>
</head>
<body>
<button onclick="make_a()">Make A</button>
<button onclick="make_b()">Make B</button>
</body>
</html>
問題
- 最初のボタンをクリックすると、期待どおりの動作が得られます。クリックするたびに「A」の新しいインスタンスが作成され、DOM に追加されます。
- ただし、2 番目のボタンで同じことを行うと、'B' のインスタンスが 1 つだけ DOM に追加され、そのままになります。何回クリックしても構いません。
- この後で「A」をクリックすると、期待どおりに新しい「A」が再び作成されます。
- 2 番目のボタンをもう一度クリックすると、既存の「B」ノードがノード リストの最後の場所に移動します。
make_b()
がと同じように動作しないのはなぜmake_a()
ですか?
いくつかのメモ:
テスト中のブラウザは Chromium 20 以降と Firefox 13 以降です。