2013-12-13 11 views
5

私はMozillaのthis articleで既にjsの継承(this onethis onethis oneなど)javascript継承の正しいプロトタイプの影響は何ですか?

上のいくつかの記事を読んで、 "古典" の継承は、このように示されている:(私は例を均一化)

// inherit Base 
function Derived() { ... } 
Derived.prototype = new Base();   <------- 
Derived.prototype.constructor = Derived; <------- 

しかしthis articleに私が参照してください。私もこれを見てきました

また
// inherit Base 
function Derived() { ... } 
Derived.prototype = Object.create(Base.prototype); <------- 
Derived.prototype.constructor = Derived; 

Derived.prototype = Base.prototype; 

そして私はまた、実験とconstructor気取りの使用を見つけることができませんでした:私はこの行をスキップした場合

Derived.prototype.constructor = Derived; <--- it still work if I skip this line 

は、new Derived()は正しくとにかくDerived()を呼び出します。

だから、1)正しいものです:

  1. Derived.prototype = new Base();
  2. Derived.prototype = Object.create(Base.prototype);
  3. Derived.prototype = Base.prototype;
  4. 他の?

2)は実際にはDerived.prototype.constructor = Derived;ですか?どうして ?

+1

それはjavascriptについてのことですが、あなたが好きなことをすることができます..私はジョンResigのclass.jsあなたのためにプロトタイプのナンセンスをラップするのが好きなので、あなたのコードでそれを見る必要はありません.http://ejohn.org/blog/simple-javascript-inheritance/ – andygoestohollywood

+1

'Object.create()は比較的以前に存在しなかったコマンドです。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create(ブラウザの互換性の概要は、そのページの一番下にあります)を参照してください。それを持っているブラウザだけを使用する場合は、それを使用してください。それ以外の方法はありません。 :) –

答えて

3
Derived.prototype = new Base(); 

これはただのプロトタイプチェーンを設定するためのBaseコンストラクタを呼び出すん。時には働き、同等の結果をObject.createに与えることもありますが、エラーが起こりやすく、避けるべきです。 What is the reason to use the 'new' keyword at Derived.prototype = new Baseを読んでください(なぜでなく、を使用する必要があります)。

Derived.prototype = Object.create(Base.prototype); 

これは、最新技術である - そう言ってCorrect javascript inheritance

This is plain wrong

Derived.prototype = Base.prototype; 
Do not useBaseDerivedのインスタンスは と同じオブジェクトから継承できますが、「ほとんど」は「クラス」に対して複数のコンストラクタを持つのに役立ちますが、これは「サブクラス化」ではありません。

Derived.prototype.constructor = Derived;は本当に必要ですか?どうして?

これは省略することもできますが、スクリプトは機能しますが、便宜上、(new Derived).constructor === Derivedが必要です。また、を見てJavaScript inheritance and the constructor property

1

this答えではJavaScriptを

を、古典的な継承を行うための正しい方法は何ですか私は2はJavaScriptで古典の継承をエミュレートするための最良の方法である理由を示す1と2の間の差を説明しました。要するに、ソリューション1では、子は親のインスタンスから継承します。解2では、子クラス(Derived.prototype)は親クラス(Base.prototype)から継承します。これは、0引数で呼び出される必要があるため、親に対して厳しい制限を課します。

第3の解決策は、DerivedクラスとBaseクラスのプロトタイプが同じオブジェクトであるため、メソッドのオーバーライドが発生しないため、さらに悪化します。さらに悪いことに、Derived.prototypeで定義されたメソッドはすべてのBaseインスタンスで使用でき、同じ名前のメソッドがBase.prototypeで宣言されていれば、単純に置き換えられます。

結論:2は、JavaScriptで古典的な継承を行う真の方法です。

は、プロトタイプのconstructorプロパティは、すべてのインスタンスにそれがアクセスできるように設定

を必要とconstructorプロパティを設定しています。これは単に便宜上のものであり、継承する部分はそれなしで動作します。

+0

悟り。質問の第2部にもお手伝いしますか? – Offirmo

+0

助けになるのはうれしいです。 – Tibos

関連する問題