2012-07-26 5 views
5

以下のコードは、Douglas Crockfordの素晴らしい本JavaScriptの一部のコードとほぼ同じです.29-30ページの「Good Parts」。唯一の違いは、彼がそうのようなGET_STATUSプロパティを追加することです:コンストラクター呼び出しパターンに関するCrockfordのコード

Quo.prototype.get_status=function() { 
    this.status=string; 
} 

彼のコードはOK実行されますが私の小さな変更は、以下、myQuoは何GET_STATUSメソッドを持っていないというエラーになり、なぜ私の質問はありますか?

<script> 
    var Quo=function(string) { 
    this.status=string; 
    } 
    Quo.get_status=function() { 
    return this.status; 
    } 
    var myQuo=new Quo("confused"); 
    alert(myQuo.get_status()); 
</script> 

答えて

8

あなたはQuo関数オブジェクトに、ではないのプロトタイプにメソッドを追加しているので、new Quo()で作成されたインスタンスに継承されることはありません。このように追加された関数は、古典的なOOP言語の静的メソッドのようなものです。Quo.get_status()で呼び出すことができますが、インスタンスによって継承されることはありません。thisQuo関数を参照します。

Quo.status = "foo"; 
Quo.get_status(); // "foo" 
+1

質問は_why_ get_statusがmyQuoに追加されていません。私はすでにQuoに追加したことを知っています。そのプロトタイプではありません。 –

+5

インスタンスは、コンストラクタのプロパティまたはメソッドを継承しません。プロトタイプにアタッチされたプロパティおよびメソッドのみが継承されます。 – nrabinowitz

0

関数はJavaScriptのオブジェクトです。関数にプロパティを追加すると、その関数のインスタンスに継承されません。しかし、関数のプロトタイプにプロパティを追加すると、それらは継承されます。プロトタイプベースの継承がJavaScriptでどのように機能するかを理解するには、following answerを読んでください。