2014/06/18

javascript オブジェクト指向

何気なく使っているが。。。実はよくわからいない。。

・document.getElementById("id名")
=->ID付ける。あれがDOM。。

・プロトタイプ・ベースのオブジェクト指向?
===>ロトタイプとは「より縛りの弱いクラス」のようなもの

・javaScriptでは厳密な意味でのクラスという概念は存在しない
javaScriptには厳密な意味でのメソッドという概念はない
多くはクラス・ベースのオブジェクト指向構文になじんでいると思われることから、ここではJavaScriptにおいて「クラス的な役割を持つ存在」を、便宜上、「クラス」と呼ぶものとする
==>だから、厳密なルールがないので、敬遠されるよ。。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
var Animal= function(name,sex){
    this.name=name;
    this.set=sex;
    this.toString = function() {
    window.alert(this.name + " " + this.sex);
  };   
}

var anim=new Animal();
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


==>たぶんね。テキストベースのコピーだけ。。browerで処理するから。。。そんなに期待しなくでもよい。。
これ「クラス(コンストラクタ)はインスタンスを生成する都度、それぞれのインスタンスのためにメモリを確保する。」
もある程度わかる。
あぁ。。まさにそうだね。。
ーー
さほど問題にはならないかもしれないが、メソッドが10も20も登録されているクラスだとしたらどうだろう。インスタンスごとに10も20ものメソッドを「無駄に」コピーしなければならなくなってしまう
ーー
JavaScriptにおいては、コンストラクタと(普通の)関数との間に本質的な違いはない
関数として呼び出すのか、それともnew演算子によって呼び出すかによって、関数の振る舞いが変わるわけである
thisキーワードは新たに生成されるオブジェクトを表すことになる。
コンストラクタ関数の役割は、あくまでこれから生成するオブジェクトの初期化を行うことであって、オブジェクトそのものを返すことではない。

==>大体こんな感じだね。。


★prototype
prototypeプロパティは、デフォルトで何らプロパティを持たない空のオブジェクト(プロトタイプ・オブジェクト)を参照しているが、適宜、必要に応じてメンバを追加することが可能である。
===>javaScriptの世界で存在するのは、常に実体化されたオブジェクトであり、新しいオブジェクトを作成するにも(クラスではなく)オブジェクトをベースにしているというだけだ。そして、新しいオブジェクトを作成するための原型を表すのが、それぞれのオブジェクトに属するプロトタイプ・オブジェクト(prototypeプロパティ)なのである。
つまり、インスタンス化に際して、プロトタイプ・オブジェクト配下のメンバが個々のオブジェクトにコピーされるわけではないので、それぞれのオブジェクトで消費するメモリを節約できるというわけだ。
===>class の抽象属性みたいね。。が。。
プロトタイプに対する暗黙的な参照が利用されるのは、読み込みの場合だけであるのだ。書き込みはあくまでインスタンス自身に対して行われるため、プロトタイプに対して変更が影響することはない
・修正ないときは俺の物を利用して、修正ある場合、自分の物を修正して。つまり俺の物を見るだけ。
==ー>いいね!

Animal.prototype.name = "サチ";

delete a1.name; // インスタンスa1のnameプロパティを削除
delete a2.name; // インスタンスa2のnameプロパティを削除

window.alert(a1.name + "|" + a2.name); // 「サチ|サチ」

==>
もちろん、「delete Animal.prototype.name」のように記述すれば、プロトタイプ・オブジェクトのメンバを削除することも可能だ。

★プロトタイプをオブジェクト・リテラルで定義する
Animal.prototype.メンバ名 = ~
==>ラベル:fuction(){}



★プロトタイプ・チェーン?
var Animal = function() {}
Animal.prototype = {
  walk : function() {
    window.alert("トコトコ");
  }
};
var Hamster = function() {};
Hamster.prototype = new Animal();
==>JavaScript(プロトタイプ・チェーン)では継承関係を自由に変更可能であるという点だ
いったん形成されたプロトタイプ・チェーンはその後の変更にかかわらず保存されること。
新規でいくらでも作れるが。。。

★連想配列(ハッシュ)?「{名前 : 値, ……}」
vaScriptではオブジェクトと連想配列との間に厳密な区別はない


★ラムダ式?クロージャ?
クロージャを使うと、データ (環境) をそれを操作する関数と結びつける事が出来ます。
<script>
function outer(){
    function inner(){
        alert("hello");
    }
    inner();  //←コレ
}

outer(); // "hello"と表示された!
</script>


・無名関数
<script>
var speak = function (){ alert("hello"); }
speak(); // "hello"と出力
</script>
右辺で無名関数を生成して、それを変数speakに代入しています。

===>speakに代入することは無駄で、すぐ実行する
<script>
(  function(){ alert("hello"); }  )(); // "hello"と出力
</script>

==>クロージャー?
<script>
//サンプル4-5

function outer(){
    var x = "hello";

    return function (){
        alert(x);
    };

}

var f =  outer();
f();  // "hello"と表示。
</script>