『開眼!JavaScript』を読んだ。

JavaScriptの仕組みとかハマりどころがいろいろわかって勉強になった。

プロトタイプ継承とかnewについてすごくわかりやすく書かれていて、特に勉強になった。非同期処理とかについては書かれてない。

メモ

prototypeプロパティ

  • prototypeプロパティは、Fuction()のコンストラクタによって生成される。

  • prototypeプロパティは、constructorプロパティを持っている。

  • コンストラクタ関数からnewされると、そのインスタンスはprototypeプロパティにリンクされる。

  • 明示的にプロトタイプチェーンを辿るなら、INSTANCE.constractor.prototype.PROPERTY

  • prototypeプロパティを別のオブジェクトで置き換えると予期しない挙動をしまくるのでやめるべき。

newの役割

  • コンストラクタのthisの値として、新しく生成されるインスタンスを設定する

  • コンストラクタにreturnがない場合、新しく生成されるインスタンスを返す。

  • newを使わず、関数がオブジェクトを明示的に返すような作りにすると、プロトタイプ継承は行われない

this

  • thisの指すものは、呼び出しのコンテクストによって変わる。
    • プロトタイプメソッド内のthisは、生成されるインスタンスを参照する。
  • call/applyを使うと、thisの値をオーバーライドできる(call/applyはFunction()のメソッド)。

プロパティの判定

  • hasOwnPropertyは、オブジェクト自身が持っているプロパティの存在確認をする。
  • inは、プロトタイプチェーンを辿って、プロパティの存在確認をする。

プリミティブ型とオブジェクト型

  • 引数: プリミティブ型は値渡し、オブジェクト型は参照渡し。

  • 比較: プリミティブ型は値を比較、オブジェクト型は参照を比較。

  • プリミティブ型をオブジェクト型のように扱おうとすると、一時的にラッパーオブジェクトが生成されるので、オブジェクトっぽく見える。

グローバル変数とグローバルプロパティ

  • グローバルコンテクストでvarをつけると、グローバル変数の宣言。

  • グローバルコンテクストで、varなしで変数に代入等すると、スコープチェーンを辿って変数を探して、存在しない場合はグローバルプロパティが追加される。

  • グローバル変数はdeleteで削除不可(DontDeleteが付与される)

スコープチェーン

  • スコープチェーンは静的なもの(静的だから、クロージャを作れる)

その他

  • Mathは先頭大文字だがコンストラクタではない。

  • グローバルオブジェクトを明示的に指定するより、スコープチェーンを辿らせる方が計算コストが安い。

  • グローバルコンテクストに書いた変数や関数は、グローバルオブジェクトのクロージャを構成するものとみなせる。

  • コンストラクタは無名関数にしない方がいい。無名関数だと、.constructor.nameでコンストラクタ名を取得できない。

  • コンストラクタを特定するためのメソッドとして、instanceofがある。

  • 関数宣言で定義された関数は巻き上げられる。関数式で定義された関数は巻き上げられない。

  • arguments.calleeは使用を禁じられている。関数を再帰呼び出しする時は、関数に名前を与えるべき。