プログラムの学習メモ


ひとまずは未だに未熟なphp,jsとかその辺を想定しつつ。。

javascriptとECMAscript
------------------------

・IEの6,7のECMAscript3にあたる部分の独自実装

> http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0001

・ECMAscirpt5の比較表をみると対応できてないブラウザが分かる（IE9以降なら対応してるとか）

> http://kangax.github.io/compat-table/es5/
> http://www.inazumatv.com/contents/archives/6359

javascriptのクラスや継承
------------------------

以下しばらく下記URL参考

> http://qiita.com/maccotsan/items/45b348d4eb52f473b0e3

下記はURLは上記に結構近い内容で図や説明が一部より詳しい

> http://d.hatena.ne.jp/maeharin/20130215/javascript_prototype_chain

### オブジェクトについて

ECMAscriptの記述がちょこちょこでている。
今の業務ではIE8までは対応することが多いけど数年もすれば対応しなくてよくなることも増えるかな。

	Object.getPrototypeOf(obj);
	Object.create(obj);

どうやら継承した後に親クラスを書き換えると子クラスにも反映するのかな。ふむふむ。

任意のオブジェクト.constructor.prototype
に継承した情報は入るが実態（処理系）では__proto__の方、
でも処理系（スクリプトエンジン？）依存が強いので注意か。
このあたりも知識として把握だけど、自分で手を出すのはあまりできなさそうだな。

ほんとはECMAscriptの仕様定義書とかみないとだめなんだろうな。

### 関数（はオブジェクト）について

・３つの定義方法
・プロパティやメソッドの書き換え
・関数（関数オブジェクト）が継承するFunction.prototype
・関数名は変数として扱われる（変数として再定義したり、上書き（多重定義）してしまえる）

Function.prototype.constructorのnativecodeは評価前で、評価後のものがFunctionとされているってことかなあ。（そうだったら、人が関数オブジェクトなら遺伝子情報的なものはnativecodeみたいなイメージ？）

このあたりは「プロトタイプベース」という概念をかんがえると少し分かった気がした。

> http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%E3%83%99%E3%83%BC%E3%82%B9
> http://ja.wikipedia.org/wiki/%E7%B6%99%E6%89%BF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

### クラスについて

・継承の際のconstructorの指定で列挙不可にしたりしているけど、この辺はもう少し深掘りできそう。
・多重継承は、一度にできるのは1:1の紐付けっぽいな。
（不要だとしても途中過程でも継承が発生？）
（少なくともここにあるスタンダードな方法では。PHPといっしょか。）
（実際はプロパティなどのコピーっぽいから同時に（順番に）紐付けもできそうだけど。）

### カプセル化について

・クロージャ（関数オブジェクトを変数保存しない）を使うと隠蔽できるっぽいけど、
それっぽく実装って書いてるのが意味深。
（chromeのコンソールだと、function scopeで、
クロージャーの（プライベートとされる？）プロパティを参照・更新できるのはなぜか。）
・クロージャではなくクラスを使った場合だとfunction scope見つけられないな。

スコープ、スコープチェーン、クロージャ、レキシカルスコープ、わかってないわあ。

> http://tacamy.hatenablog.com/entry/2012/12/31/005951
> http://qiita.com/takeharu/items/4975031faf6f7baf077a
> http://hisasann.com/housetect/2007/12/post_44.html
> http://d.hatena.ne.jp/susie-t/20070719

スコープチェーンについての詳しい解説

> http://d.hatena.ne.jp/maeharin/20130313/javascript_scopechain

### 抽象化について

ここでの仕組みは簡単だけど奥は深いのかも。使いどころがよくわからん。

### ファクトリについて

自身にプロパティと配列でクラスを保持する感じ。

### コメントのコンストラクタ関数のプロトタイプ変更リスクまわりについて

ECMAscript3では列挙不可にできないっぽいな。

### jQueryの.extendについて

ひとまず浅い理解で済ませる。
targetを指定すればjQueryの名前空間で無くtargetオブジェクトの拡張コピー（継承）につかえる
引数を増やせば連続して解決させて多重継承させられる

> http://semooh.jp/jquery/api/core/jQuery.extend/object/
> http://tech.kayac.com/archive/jquery-codereading-tips.html
> http://tech.nitoyon.com/ja/blog/2011/03/24/jQuery-extend-mania/

### Mix-inについて

ググってみて、この用語周りで深掘りするといろいろ勉強することが出てきそうな感あり。。
Mix-inの定義も今ひとつわからないけどひとまずいいや。

・多重継承は同名のメソッドが避けられない場合などがあり禁止されるかのジレンマがある
・インターフェイスは必要なメソッドがある場合継承する仕組み（ひとまず浅い理解）
・インターフェース以外にも 多重継承しても問題を起こさず、役に立つものとしてMix-in
（メソッドを追加実装し、属性は継承しないことにより多重継承の問題を避ける）
（多重継承は禁止し、インターフェースと Mix-in だけ許可という点でRubyやDartはいいんじゃないのって。ふむ。）

> http://yohshiy.blog.fc2.com/blog-entry-160.html
> http://www.geocities.jp/m_hiroi/light/lua06.html

「javascriptでの継承の基本パターン４つ」の記事のコメント「要するに動的に継承のようなことをするのはすべてmixin。。」の下りの意味がよく分からない。コメントつけるかな。気が引けるな。orz
wikipediaでは、「mixin は、「メソッド付きのインターフェース」ということもできる。」とか「mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。」とされているみたい。

> http://ja.wikipedia.org/wiki/Mixin

### 継承の基本パターン４つについて

・Object.createが実装されていないブラウザではマナーを守った実装をする。
・クラスの概念は理解しても使わずに実装するのがスタンダード。
・「クラスの概念を使う」というのは「__super」と「constructor」を上書きして親クラスへの参照を貼ることかな。あとはコンストラクタ関数で初期化するかどうかなのかな。この辺まだ論理的理解が出来てないな。orz
・「クラスの概念」を使わないと、「enumerable」のプロパティとか設定できないから新しめのエンジンで機能を十分に利用できないのでは無いだろうか。どうだろう。
・プロトタイプチェーンを使うと、親クラスの変更を子クラスへリアルタイム反映できる。でもそういう実装は変則的になりうるのであまりメリットは無い。ってことかな。（？）まあ、そういうことなら視認性が良いコードを選ぶかなあ。。
・プロトタイプチェーンを使うことに関しては、多重継承とかいうときにのメリットについての考察などが深めうると思うけどどうなんだろう。
・「クラスの概念」を使わないパターンは関数を拡張して、さらにプロトタイプを拡張するという手続きで継承してるということなのかな

> http://qiita.com/norami_dream/items/ea3827f05699afcb1cc5

### クラスの概念を使わずに、継承を統一的に扱えるjQuery.extend風ライブラリについて

「あえて、クラスの概念を使わず、でも、必要に応じてクラス相当のことができるという実装になっている」と書いてある。
「クラスの概念」を使わないと、「enumerable」のプロパティとか設定できないから新しめのエンジンで機能を十分に利用できないのでは無いだろうか。どうだろう。っと思っていたのでそこをカバーするということなのかな。
コードは未だ読んでない。orz

> http://qiita.com/norami_dream/items/7090345ac11d84c7564a

### スコープチェーン・実行コンテキストについて

・プロトタイプチェインはあくまでも、__proto__の連鎖検索
・実行コンテキストはスタック構造でグローバルオブジェクトとcallオブジェクト
・スコープは関数の定義時に決定される
・関数名と関数オブジェクトとCallオブジェクトはそれぞれ別物という認識であってるかな。
・スコープチェーンは実行コンテキストを検索するためのリストという感じかな。

> http://kokudori.hatenablog.com/entry/20120920/1348139190
> http://realisapp.com/javascript/%E3%80%90js%E3%80%91%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91js%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%A8%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%E3%83%81/
> http://wiki.bit-hive.com/tomizoo/pg/JavaScript%20%BC%C2%B9%D4%A5%B3%A5%F3%A5%C6%A5%AD%A5%B9%A5%C8

### thisについて

thisの参照について。実装レベルでおまじない的な理解と想像になってる面があるかもだけど、ひとまず置いておく。

### プライベートはあきらめましょう？などについて

ふむ。

	「これがJavaScriptにおける完璧なカプセル化だ！」みたいな記事はたくさんありますが、全然カプセル化できていなかったり、すごく不便だったり（privileged系）、メモリ消費が激しく継承を併用出来なかったり（クロージャでごまかした系）、必要なライブラリが膨大だったり（独自でオブジェクトシステム作っちゃった系）して、どれも完全にはうまくいっていないはずです。

ほかの項も、ここまでのお勉強のあとに読むと深まる気がする。面白い。

・privateは諦めましょう
・親のメソッドを呼ぶ
・コンストラクタ
・instanceofに対応する
・ダックタイピングのススメ

> http://blog.tojiru.net/article/199860818.html

ここまでの疑問が残る箇所
------------------------------------------------

・「Mix-in」の定義
・「●●チェイン」の定義
・「.extend」の詳細をスキルとして覚える
・「クラスの概念」を使うという意味
・「クラスの概念」を使わない継承の場合のクラスの多重継承的な動作などの可否
・callオブジェクトとそのスコープ（分かったかもだけど少し不安）
・関数オブジェクトとそのスコープ（分かったかもだけど少し不安）
・instanceofとその問題

以降続き候補。。
------------------------

継承周り（疲れてきたので一度おいておくかな）
設計関連
PHPのインターフェイスとか概念的なところ
PHPの関数をいろいろ眺めておさらいというか知識を補う
coffie scriptとかnode.jsとか