tasuwo's blog

考えていることとか,実践していることとか,技術的なこととか

JavaScript を学習している

今日の記録

  • 筋トレ: 継続中
  • 早起き: 6時起床

雑記

昨晩なかなか寝付けなかったため当初の予定時刻(5時)に起床できなかった. 筋トレは一応続いているけれど,明日からは環境が少し変わるためできるか怪しい. 継続が重要だと考えている取り組みなので,せめて腕立ての 2~3 セットくらいはしたい.

昨日以下の本を読み終えた.

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

電子書籍なので厚みはわからないが,200ページ程度なので二、三日で読むことができた.JavaScript は以前から利用していたが,都度ググりながら手探りでコードを書いていた状況だった.Web 系企業に入社したならばしっかり学んでおいてとりあえず損はないだろうと考え勉強している.上記の本についてはJavaScript の言語としての特徴が,浅すぎず深すぎずまとめられていたと思う.しかし,まだまるで JavaScript 初心者なので,あまり偉そうに言えることはない.

言語としての特徴がわかっても,それを生かしてどのようにコードを書いていけば良いかがわからなかったので,以下の本を購入し,今日は読んでいた.

オブジェクト指向JavaScriptの原則

オブジェクト指向JavaScriptの原則

こちらはまだ途中だが,JavaScriptオブジェクト指向したい場合にどうするか,といった視点で書かれており,クラスベースの言語から移ってきた自分としてはとてもわかりやすく,ためになる.開眼と違って ES5 をターゲットにしており(開眼は ES3),さらに ES5 で追加された機能を積極的に利用しているのもよかった.また,開眼の方よりも JavaScript の仕様に多少踏み込んで説明している部分が多い.例えば,内部プロパティに関する記述は開眼の方にはなかった.

こちらも分量としてはそうでもないので今日中に読み切ってしまいたかったのだが,途中プロトタイプについて混乱してしまい,用語の定義等を確認したくなり ECMA-262 を読みにいくなどした.特に,以下の箇所について理解が曖昧だった.

  • constructor.prototype と [[Prototype]] 内部プロパティ
  • built-in オブジェクトの [[Prototype]] 内部プロパティ
  • Prototype Object の constructor の参照先

大体わかっていなかったことは解決した.仕様を読んでなるほどと感じたことは以下のような感じ.

  • built-in オブジェクトのコンストラクタは全て関数であり,その [[Prototype]] 内部プロパティは Function Property Object を参照している (考えてみれば当たり前)
  • Function オブジェクトのインスタンス = JavaScript における関数には, その全てに prototype プロパティが付加されている.これは,あらゆる関数はコンストラクタになりうるためである
  • すべてのオブジェクトに追加される内部プロパティと,特定のオブジェクトに追加される内部プロパティがある.[[Prototype]] は前者,[[Construct]] は後者

途中, constructor.prototype と [[Prototype]] 内部プロパティが同じ対象を指し示すのかと勘違いしてしまい混乱した.また,以下についてはまだ理解が曖昧なので,明日の朝にでももう一度学習し直す.

  • built-in オブジェクト の Prototype Object の constructor プロパティには,初期値として同じ型の built-in オブジェクトのコンストラクタ関数が格納される?

そもそも,constructor プロパティはインスタンスの生成元のコンストラクタ関数を指すという様々な場所説明がされており,それは正しいと思うのだけど,じゃぁ built-in オブジェクトの Property Object の constructor は何を指しているんだろう?と思った.結論から言うと,例えば Array Prototype Object の constructor は Array Constructor を指しているっぽいけど,これで良いのかな?また,すべての built-in オブジェクトのコンストラクタ関数は関数型を継承している(と,いう理解であっているのかも曖昧なところ)ということは,Function コンストラクタ関数オブジェクトは Function 型を継承しているということになる.まぁ,コンストラクタ関数なので関数型を継承しているのは当たり前なのだけど,何か不思議な感じがする.しかし,Function オブジェクトの [[Prototype]] 内部プロパティが,Function Prototype Object を指しているのは間違いないはず.

これらはしっかり理解できたら Qiita にでもまとめるかもしれない.しかし,正直プロトタイプ周りはたぶん割と皆つまづくところで,説明がされつくしてる部分のようにも思える.一方,投稿したら JavaScript のつよい方々から色々とばしてもらえるかもしれない.悩みどころだ.

JavaScript 関連の本としては,オライリー本の中だとサイ本が人気のようだが,今はあまりこればかりに時間をかけるつもりはないので,今の本を読み終えたらとりあえず何か適当に JavaScript で作ってみようと思う.