もしそうなら(フィドルに示されているように)
Employee.prototype = Person.prototype;
thenEmployee
は のサブクラスでPerson
はなく、同じクラスになります (ただし、2 つの異なるコンストラクターがあります)。
より正確には、 のプロトタイプに追加するメソッドとプロパティは、任意のEmployee
にも表示されますPerson
。OOP のクラスは、スーパークラスに影響を与えてはならないことに注意してください。
Employee.prototype = Object.create(Person.prototype);
と同様に、新しいオブジェクトを作成します
Employee.prototype = {};
Employee.prototype.__proto__ = Person.prototype
except Object.create
(unlike __proto__
) はすべてのブラウザーで動作します。
Employee.prototype = new Person();
ただし、のコンストラクターは追加のプロパティをPerson
設定することもできますが、追加のプロパティなしでオブジェクトを作成します。Employee.prototype
Object.create
あなたのフィドルの無限ループは、 が を呼び出しているために発生しますが、Employee.prototype.sayHi
それ自体が呼び出されます(元は に割り当てられたときに失われました)。Person.prototype.sayHi
Employee.prototype.sayHi
Person.prototype.sayHi
Person.prototype.sayHi
Employee.prototype.sayHi
その場合Employee.prototype === Person.prototype
、必然的に、Employee.prototype.sayHi === Person.prototype.sayHi
.