8
var p = function () {
    this.show = function () {
       alert('hello world!!!');
    }
}

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

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

警告し"hello world!!!"ます、なぜですか?

プロトタイプメソッドを変更できますか?はいの場合、どのように変更できますか?

4

3 に答える 3

7

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

EcmaScript 仕様から:

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

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

于 2012-12-05T08:21:06.640 に答える
3

prototype.show関数内でメソッドをオーバーライドしますp

于 2012-12-05T08:20:39.183 に答える
1

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

于 2012-12-05T08:24:01.460 に答える