プロトタイプチェイン・プロトタイプ継承

前提

 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を作り、プロトタイプで継承する。

プロトタイプチェイン

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

上の場合メソッドsay()の検索は次の順で行われる。

  • d.say()
  • Dog.prototype.say()
  • Animal.prototype.say()
  • Object.prototype.say()

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

プロトタイプ継承の注意点

継承のために、

 Dog.prototype = new Animal;

ではなく、

 Dog.prototype = Animal.prototype;

としてはならない。この場合、DogのprototypeはAnimalのprototypeを参照する事になるので、

 Dog.prototype.foo = function () { alert('foo()'); };

のようにDogにメソッドを追加すると、Animalにもメソッドが追加されてしまう。

 var a = new Animal();
 a.foo(); // 本来、未定義であるべき

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

Last-modified: 2012-07-24 (火) 16:00:42