2009-04-15 9 views
7

プロトタイプの概念を学んだときにJavaScriptを学ぶ。 catクラスに新しいメソッドを追加することに成功しましたが、元のトークメソッドをオーバーライドできませんでした。JavaScriptプロトタイプ関数が元のプロトタイプ関数をオーバーライドしていない

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " : I'm a girl!") 
    } 
} 

cat.prototype.talk = function() { 
    alert(this.name + " : I'm a dude!") 
} 

cat1 = new cat("felix") 
cat1.talk() 

なぜ新しいテキストが表示されないのですか?

答えて

16

'function cat'は単なる関数です。プロトタイプは空のObject({})です。 '新しい猫'を呼び出して、メンバーの名前と話を新しいオブジェクトに追加することができます。その新しいObjectの下には関数プロトタイプがありますが、これはまだ{}です。

var c= new cat('Tiddles'); 

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: {} 

今、あなたは「cat.prototype.talk」に書くとき、あなたはその基礎となるオブジェクトにメンバーを追加している:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: { 'talk': function() {...} } 

「C」のインスタンスに直接設定「話」関数が取りますcのコンストラクタプロトタイプに間接的に設定された 'talk'より優先されます。

ここでは、2つのスタイルの継承、 'this'-assigningメソッドと' prototype 'メソッドが混在しています。

プロトタイプへのメソッドの記述には、すべてのオブジェクトインスタンスにコピーされた同じメンバの冗長コピーを取得しないという利点があります。インスタンスへの書き込みは、バインドされたメソッドの問題を解決するという利点があります。あなたが選ぶのはあなた次第ですが、2つを混ぜないでください。プロトタイプルートに行きたい場合は、 '名前'のみが 'this'に書き込まれます。これは、それが各インスタンスに固有の唯一のプロパティだからです。

7

最初に付けられた機能がオブジェクトに付加されています(インスタンスごとに1つの関数)。もう1つはプロトタイプに添付されています(すべてのインスタンスが共有する1つの関数)。

オブジェクトレベルのメンバーは、プロトタイプレベルのメンバーをオーバーライドします。

関連する問題