2010-12-29 12 views
2

現在、私は 'Object-Oriented JavaScript'を読んでいます。 さらに、私はその本からの例題を実行しているときに困ったことに遭遇しました。以下JavaScriptプロトタイプの問題

コードサンプルである:

var Dog = function() { 
    this.tail = true; 
}; 

var benji = new Dog(); 
var rusty = new Dog(); 

Dog.prototype.say = function() { return "Woof!"; }; 

benji.say(); 
rusty.say(); 

Dog.prototype = { 
    paws: 4, 
    hair: true 
}; 
Dog.prototype.constructor = Dog; 

var lucy = new Dog(); 
lucy.say(); 

本質的に、アイデアは、以下の作業有することである。

  1. はconsole.log(lucy.sayを())。
  2. console.log(benji.paws);
  3. 明白な - lucy.say();不思議なこと

など

、私は「T」に、しかし無駄に例をコピーしました。 誰かが少し光を当てることができたら、私は感謝以上のものになるでしょう。

Dog.prototype = { 
    paws: 4, 
    hair: true 
}; 

を行うことにより

乾杯

+1

"ヒカップ"とは何ですか?奇妙なことは何ですか? –

+0

本から引用:古いオブジェクトは新しいプロトタイプのプロパティにアクセスできないことが判明しました。彼らはまだ古いプロトタイプオブジェクトを指し示す秘密のリンクを保持しています。最も混乱する部分は、コンストラクタのプロトタイプを参照するときです。 typeof lucy.constructor.prototype.paws "undefined" typeof benji.constructor.prototype.paws "番号 " 上記のすべての予期しない動作が修正されました: Dog.prototype = {paws:4、hair:true}; Dog.prototype.constructor = Dog; 注:プロトタイプを上書きするときは、コンストラクタプロパティをリセットすることをお勧めします。 – domscripter

+0

はい、 'lucy.constructor.prototype.paws'は修正されますが、' say'メソッドは 'lucy'にはなりません。 –

答えて

6

を、あなたは完全に新しいプロトタイプオブジェクト(あなたがprototypeに新しいオブジェクトを割り当てている)を作成します。メソッドsay()は、新しいDogオブジェクトでは使用できません。また、古いオブジェクトでは、プロパティpawsおよびhairも使用できません。

あなたが欲しい:

Dog.prototype.paws = 4; 
Dog.prototype.hair = true; 

あなたが試すことができます。

console.log(benji.__proto__ === rusty.__proto__); // prints true 
console.log(lucy.__proto__ === rusty.__proto__); // prints false 

console.dir(x.__proto__)は(少なくともChromeで)あなたのプロトタイプオブジェクトのプロパティを表示する必要があります。

関連する問題