JavaScriptプロトタイプ継承に関する15の異なる書籍、記事、またはSOの質問を読んでいる可能性があります。それぞれが少しずつ異なる方法を持っていたので、これを一度にすべて取得したいと考えていました。プロトタイプ継承設定
予想通り例
function Rectangle(h, w){
this.height = h;
this.width = w;
console.log("Rectangle ctor: "+ this.height + "x" + this.width);
}
Rectangle.prototype.getArea = function(){
return this.height * this.width;
}
var a = new Rectangle(3, 4);
console.log(a.getArea());
function Square(l){
this.height = l;
this.width = l;
console.log("Square ctor");
}
Square.prototype = new Rectangle();
Square.prototype.constructor = Square;
var b = new Square(5);
console.log(b.getArea());
この例では、動作します。 SquareオブジェクトはRectangleから継承されるため、getArea()
メソッドを使用できます。しかし、私が見ているところによっては、私が常に違ったことをしていることが1つあります。
Square.prototype = new Rectangle()
の代わりに、私は人々がSquare.prototype = Object.create(Rectangle.prototype)
を使用しているのを見ました。私はこれをテストする場合、両方が同じように機能するように見える、私はこれを行うとき、私は気づく唯一の違いは、次のとおりです。
console.log(new Rectangle());
console.log(Object.create(Rectangle.prototype));
これははその後、ログに記録し、height
とwidth
プロパティが含まれnew Rectangle()
をログに記録しますObject.create(Rectangle.prototype)
は、height
とwidth
を除き同じものを記録します。
私の質問は、どうして誰かがそれをして、他の人はしないのですか?もう一つは他よりも有益でしょうか?私がそれを理解する方法は、new Rectangle()
を使用するものは、プロトタイプの高さと幅のプロパティを取得しますが、問題が発生する可能性があります。
誰かがこれにいくつかの光を当てることができますか?ありがとう!
EDIT
私はまた、広場のプロトタイプとしてnew Rectangle()
を使用しているときObject.create()
方法がないのに対し、それは実際に、(いくつかのケースで役に立つ何かをする場合があります)コンストラクタを呼び出すことに気づきました。サブタイプに必要なオブジェクト状態を生成するためにコンストラクタを呼び出す必要があるかどうかという点で、ユースケースに関連する2つの異なる用途の背後にある理由はありますか?
一度限りですか? ES6の 'class'構文を使用します。 – Bergi
はい、すべてのブラウザがまだES6を使用できるわけではありませんが、私は現在Babelを使用していません。プラスその私が興味を持ってフードの下で起こっていただきまし理解についての詳細。 –