2016-04-14 10 views
0


私はちょうどjava script prototype programmingを読んで、小さなコードを試しました。メソッドは、Javaスクリプトのプロトタイプでオーバーライドしません

function Ninja(){ 
    this.swingSword = function(){ 
    return true; 
    }; 
} 

//override the prev one 
Ninja.prototype.swingSword = function(){ 
    return false; 
}; 

var ninja = new Ninja(); 
console(ninja.swingSword()); 

が、私は、私の第二の方法は、最初のものを上書きしていないtrueとしてのOPが、残念ながらそれは与えられた出力falseになりますと思いました。どうして?


だけNinja.prototype.swingSword() JsFiddleこれは.....

を正しいオーバーライドを与えるので、ここでobject(ninja)を作成する目的は何ですか?

+0

存在する場合、オブジェクトのプロパティはプロトタイプで同じ名前を持つプロパティを上書きします。ポイントは、オブジェクト内にプライベートオブジェクトのプロパティを保持し、作成されたオブジェクト間で共有できるプロパティとメソッドをプロトタイプに移動することです。 – Redu

答えて

0

プロトタイプで関数を定義すると、その関数はすべてのインスタンスに拡張され、パフォーマンスが向上します。

関数を呼び出すと、常にインスタンス自体が最初に表示され、呼び出された関数が見つからない場合はプロトタイプが表示されます。

3

あなたは2つのswingSword機能を持っています。

1つは試作品です。もう1つはインスタンスにあります(コンストラクタ関数によって割り当てられます)。

swingSwordプロパティにアクセスしようとすると、JSはまずオブジェクトを検索し、見つからない場合はプロトタイプチェーンを検索します。

これで、最初にコンストラクタ関数で定義されたものが見つかると、それは見えなくなります。

簡潔に:オーバーライドは、あなたが期待していると思われるものとは反対の方向に働きます。

0

オブジェクトoのプロパティxを照会したとします。

oにその名前の独自のプロパティがない場合は、oのプロトタイプオブジェクトがプロパティxに対してクエリされます。プロトタイプオブジェクトにその名前のプロパティがなく、プロトタイプ自体がある場合、プロトタイプのプロトタイプに対してクエリが実行されます。これは、プロパティxが見つかるか、プロトタイプがnullのオブジェクトが検索されるまで続きます。

ご覧のとおり、オブジェクトのprototype属性は、プロパティが継承されるチェーンまたはリンクされたリストを作成します。

この問題も同様です。オブジェクトには独自の関数があるので、プロトタイプオブジェクトでは決して見えません。オブジェクトのswingSword()関数によって返される結果は常に得られます。

関連する問題