* プロトタイプチェイン・プロトタイプ継承 [#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(); // 本来、未定義であるべき