* プロトタイプチェイン・プロトタイプ継承 [#i3e0a439]

** 前提 [#b61a4c99]
 var Animal = function() {};
 Animal.prototype = {
     say: function() { alert("I am an Animal"); }
 };
 var Dog = function() {};
 Dog.prototype = new Animal;
 Dog.prototype.say = function() { alert("I am a dog"); }
以上のように親クラスAnimalと子クラスDogを作り、プロトタイプで継承する。

** プロトタイプチェイン [#efb4d835]
 var d = new Dog;
 d.say();
上の場合メソッドsay()の検索は次の順で行われる。
- d.say()
- Dog.prototype.say()
- Animal.prototype.say()
- Object.prototype.say()

親クラスを辿って行き、最終的にObject.prototypeで見つからなければ、終了する。

** プロトタイプ継承の注意点 [#fbdffe52]
継承のために、
 Dog.prototype = new Animal;
ではなく、
 Dog.prototype = Animal.prototype;
としてはならない。この場合、DogのprototypeはAnimalのprototypeを<<参照>>する事になるので、
としてはならない。この場合、DogのprototypeはAnimalのprototypeを参照する事になるので、
 Dog.prototype.foo = function () { alert('foo()'); };
のようにDogにメソッドを追加すると、Animalにもメソッドが追加されてしまう。
 var a = new Animal();
 a.foo(); // 本来、未定義であるべき

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS