プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

オブジェクトについて2

よく耳にするプロトタイプについて。
ここまで理解できればライブラリもなんとか読めそうな感じ。

コンストラクタ

全ての関数オブジェクトがコンストラクタに使える。
new すると、あらたなオブジェクトが生成される。

function f(){this.name="hello constractor"};
var obj = new f();
alert(obj.name);

プロトタイプ

全ての『関数オブジェクト』はprototypeを隠しプロパティとして持つ*1。指定したプロパティが存在しない場合は、prototypeに設定したプロパティが参照される。


プロトタイプには、オブジェクトも代入できるので、複数階層の継承を実現できる。最上位はObjectオブジェクトで、ここまで辿って存在しなかった場合に未定義と判定される。(これがプロトタイプチェーン)

//最上位
Object.prototype.last = function(){alert("ここが最後");};

var classA = function(){
  this.name = "A";
  this.sayname = function(){alert(this.name);};
};
objA = new classA();

//関数オブジェクト
var classB = function(){
  this.name = "B";	
};

//プロトタイプにオブジェクトを指定すると継承できる
classB.prototype = objA;

//classB.prototype.sayname = function(){alert("オーバーライド");}
classB.prototype.sayhello = function(){alert("メソッド追加");}

objB = new classB();
objB.sayname();   //B
objB.sayhello();  //メソッド追加
objB.last();      //ここが最後
objB.undefined(); //エラー


結構分かってきたけどまだなんかもやもや。
あとは慣れの問題かなー。

*1:newで生成したオブジェクトにprototypeを設定しようとしててしばらくはまった。。