JavaScriptでプロトタイプベースの継承を理解しようとしています。コンストラクタ関数とプロトタイプチェーンを確立するには、通常、このようにそれを実行します。型継承:プロトタイプを直接設定するのではなく、なぜ新しいオブジェクトを作成する必要がありますか?
function Person(name, gender){
this.name = name;
this.gender = gender;
}
function Male(name){
Person.call(this, name, "male");
}
Male.prototype = Object.create(Person.prototype);
Object.defineProperty(Male.prototype, "constructor", {
enumerable: false, value: Male, writeable: true
});
var person1 = new Male("Chris");
ので、Male.prototype
のためにあなたが親オブジェクトに設定された内部[[プロトタイプ]]プロパティを持つ完全に新しいオブジェクトを作成します。これは新しいオブジェクトであるため、列挙できないconstructor
プロパティを追加する必要があります。直接[[prototype]]
プロパティを設定する方法があるので
は、私はあなたがこれを行うことはできませんなぜだろ:
function Person(name, gender){
this.name = name;
this.gender = gender;
}
function Male(name){
Person.call(this, name, "male");
}
Object.setPrototypeOf(Male.prototype, Person.prototype);
var person1 = new Male("Chris");
このソリューションを使用すると、ちょうど親オブジェクトにMale.prototype
の[[prototype]]
プロパティを設定します。 (ES6の前に、__proto__
プロパティを使用してプロトタイプを設定できました)新しいオブジェクトを作成する必要はありません(jsランタイムが自動的にがすべての関数に新しいprototype
オブジェクトを添付しています)正しいconstructor
プロパティを明示的に作成する必要はありません。既に存在するためです。
私の質問です:なぜ誰もプロトタイプチェーンを設定するためにこのアプローチを使用しないのですか?問題はどこだ?
FYIでは、第2引数を使って 'constructor'プロパティを定義することで、' Object.create'バージョンをもう少しきれいに行うことができます。 –
'Object.defineProperty..'行は実際にコンストラクタを設定する一般的な方法ではありません。その全体の指示(3行)は単に次のようになります: 'Male.prototype.constructor = Person;' –
@ScottMarcus:これはそれを列挙します。 'defineProperty'を使うと、正しいプロパティ記述子を設定できます。 –