オブジェクトについて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を設定しようとしててしばらくはまった。。