2012-12-05 12 views
8
var p = function() { 
    this.show = function() { 
     alert('hello world!!!'); 
    } 
} 

p.prototype.show = function() { 
    alert('haha'); 
} 

var o = new p(); 
o.show(); 

警告:"hello world!!!"、なぜですか?プロトタイプで宣言されている関数が呼び出されないのはなぜですか?

プロトタイプメソッドを変更することはできますか?

+1

非常に徹底的な説明:http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript –

+1

FYI:プロトタイプメソッドを呼び出すことができます。 prototype.show.call(o) ' – Prinzhorn

答えて

7

これは、コンストラクタで定義した特定の関数がプロトタイプから継承した関数をオーバーライドするためです。

EcmaScript specificationから:

コンストラクタによって作成されたすべてのオブジェクトは、そのコンストラクタの 「プロトタイプ」プロパティの値(オブジェクトのプロトタイプと呼ばれる)の暗黙的な参照 を持っています。さらに、プロトタイプは、そのプロトタイプへの暗黙的な参照などである可能性があります。これは プロトタイプチェーンと呼ばれます。オブジェクト内のプロパティに参照が行われると、 の参照は、その名前のプロパティを含むプロトタイプチェーン の最初のオブジェクトのその名前のプロパティへの参照です。他の 単語では、最初に直接言及されたオブジェクトがそのような プロパティについて調べられます。そのオブジェクトに名前付きプロパティが含まれている場合は、その参照先が参照するプロパティーが です。そのオブジェクトに が含まれていない場合は、そのオブジェクトのプロトタイプが調べられます next;等々。

要するに、関数(またはその名前で任意のプロパティ)を探すときは、オブジェクトから始まり、プロトタイプチェーンに入ります。

+1

素晴らしい答え=) –

3

prototype.showメソッドをp機能でオーバーライドします。

1

Javascriptでは、プロパティが解決されると、エンジンはまずオブジェクトのプロパティを調べます。あなたの例では、オブジェクトはthisで表されます。プロパティが見つかった場合、この場合はshow(関数はプロパティであることを忘れないでください)、そのプロパティを使用します。プロパティが見つからない場合は、プロパティを解決するためにプロトタイプチェーンを反復処理します。

関連する問題