2016-09-14 23 views
0

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)); 

これははその後、ログに記録し、heightwidthプロパティが含まれnew Rectangle()をログに記録しますObject.create(Rectangle.prototype)は、heightwidthを除き同じものを記録します。

私の質問は、どうして誰かがそれをして、他の人はしないのですか?もう一つは他よりも有益でしょうか?私がそれを理解する方法は、new Rectangle()を使用するものは、プロトタイプの高さと幅のプロパティを取得しますが、問題が発生する可能性があります。

誰かがこれにいくつかの光を当てることができますか?ありがとう!

EDIT

私はまた、広場のプロトタイプとしてnew Rectangle()を使用しているときObject.create()方法がないのに対し、それは実際に、(いくつかのケースで役に立つ何かをする場合があります)コンストラクタを呼び出すことに気づきました。サブタイプに必要なオブジェクト状態を生成するためにコンストラクタを呼び出す必要があるかどうかという点で、ユースケースに関連する2つの異なる用途の背後にある理由はありますか?

+0

一度限りですか? ES6の 'class'構文を使用します。 – Bergi

+0

はい、すべてのブラウザがまだES6を使用できるわけではありませんが、私は現在Babelを使用していません。プラスその私が興味を持ってフードの下で起こっていただきまし理解についての詳細。 –

答えて

1

あなた自身があなたの質問に答えたと思います。 new Rectangle()Object.create(Rectangle.prototype)の違いは、前者がコンストラクタを呼び出し、後者がコンストラクタを呼び出すことではありません。そのため、常にObject.create()を使用する必要があります。それ以外の場合は、コンストラクタが2回呼び出されます(例のように)。

また、ECMAScript 6では、class syntaxを使用することができます。class syntaxは、継承のような多くの作業を簡略化します。

+0

[OK]をおかげで、私はより多くの1つのバージョンが技術的には「非推奨」されている場合か、彼らはあなたのユースケースに応じて、両方とも完全に有効であるかどうかを判断しようとしていますね。両方で遊んでたら、あなたがプロトタイプを持っていない)あなたは1)コンストラクタ余分な時間と2を呼び出す必要はありませんので、 'Object.create(Rectangle.prototypeが)'物事のクリーンな方法であることが表示されますサブタイプのオブジェクトの影のプロパティ '唯一のIMO –

+0

@MattHintzkeを(「新しい」、高さと幅を使用している場合は、this.heightと広場のコンストラクタにthis.widthの影ます' Square.prototype'に追加されます) Object.create() 'オプションが有効です。 –

+1

@MattHintzkeよりクリーンで、エラーを起こしにくいです。プロトタイプを作成するための 'new'は、同じ動作をするエッジケースがある場合でも、事実上廃止予定です。 – Bergi

関連する問題