あなたはこの代わりにしたい:
function Man(name) {
Human.call(this, name, "Male");
}
そのコードは、あなただけ呼び出すしようとしているように思え
何親のコンストラクタHuman
はプロトタイプの継承ではありません。上のコードはHuman
のコンストラクタをとり、this
- 新しいMan
オブジェクトに適用します。
あなたのコードが行Man.prototype = new Human(name, "Male")
がMan
のプロトタイプ新しい男がを作成されるたびに変化している
何。それだけでなく、プロトタイプオブジェクトの再割り当てが完了しているので、の後に割り当てられたオブジェクトにのみ適用されます。つまり、最初のオブジェクトではありません。したがって、m.name
は未定義です。
適切原型継承
注自動的Human.prototype
に割り当てられたすべてのメソッドを継承するためにMan
原因はなりません、上記の私のコードのように、親のコンストラクタを呼び出すこと。これを行う最善の方法は、Human.prototype
をMan.prototype
にクローンし、コンストラクタの外にクローンすることです。このように:
function Man(name) {
Human.call(this, name, "Male");
}
function inherit(parent, child) {
if (Object.create) child.prototype = Object.create(parent.prototype);
else {
for (var key in parent.prototype) {
if (!parent.prototype.hasOwnProperty(key)) continue;
child.prototype[key] = parent.prototype[key];
}
}
}
inherit(Human, Man);
これはかなり冗長に見えるかもしれませんが、代替はこれを実行することがあります
はを動作しますが、我々はに強制しているので、望ましくない副作用を引き起こします
Man.prototype = new Human('no name', 'Male');
prototype
にダッド名を割り当てて、Human
のコンストラクタにプロトタイプを割り当てるだけの余分な時間を呼ぶようにします。このパスを終了し、後でthis
にプロパティを割り当てる以外にも、Human
コンストラクタを変更すると警告されます。
メソッドは、ベースとサブの両方で定義する必要がありますか? JavaScriptを使って基本的な古典的継承の完全な例を教えてください。 – Sam