0

Tuts+ OO JavaScript トレーニングを表示しています: 彼らがプロトタイプの継承を行う方法は次のようになります:

Employee.prototype = Object.create(Person.prototype);

しかし、なぜ私は(オブジェクトを作成せずに)できないのですか

Employee.prototype = Person.prototype;

2番目は無限ループを与えます: http://jsfiddle.net/VMqSy/

なんで?プロトタイプをログに記録するコンソールは、 1 が Employee.prototype に 1 より多くのレベルを与えることを教えてくれObject.create()ます。__proto__Person.prototype

4

1 に答える 1

2

もしそうなら(フィドルに示されているように)

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.prototypeObject.create


あなたのフィドルの無限ループは、 が を呼び出しているために発生しますEmployee.prototype.sayHiそれ自体が呼び出されます(元は に割り当てられたときに失われました)。Person.prototype.sayHiEmployee.prototype.sayHi Person.prototype.sayHiPerson.prototype.sayHiEmployee.prototype.sayHi

その場合Employee.prototype === Person.prototype、必然的に、Employee.prototype.sayHi === Person.prototype.sayHi.

于 2012-12-05T10:26:08.357 に答える