1. JavaScriptの核となる概念
-----------------
プロトタイプチェーン:
----
家族の遺伝をイメージしてください。子供は親から特徴を受け継ぎ、親も祖父母から受け継いでいます。JavaScriptでは、オブジェクトが他のオブジェクトのプロパティやメソッドをプロトタイプチェーンを通じて「継承」します。これはまるで子どもが親の所有物にアクセスできるようなものです。
var BaseClass = function() {
Object.prototype.a = function() {}; // すべてのオブジェクトにメソッドaを追加
Function.prototype.b = function() {}; // すべての関数にメソッドbを追加
var instance = new BaseClass(); // インスタンスを作成
};
// コンストラクタBaseClassを定義
// BaseClass内でObject.prototypeを変更しメソッドaを追加
→ これにより配列や関数などすべてのオブジェクトがaをプロトタイプチェーンでアクセス可能に
// Function.prototypeを変更しメソッドbを追加
→ これによりBaseClassなどすべての関数がbをアクセス可能に
// BaseClassのインスタンスinstanceを作成
function Store(){};
Store.prototype.product = "マスク";
// customer.__proto__ ==== Store.prototype;
function Branch(){};
Branch.prototype = new Store();
// customer.__proto__ ==== Branch.prototype;
var customer = new Branch();
console.log(customer.product);
プロトタイプチェーンの検索過程(買い物例)
customer(あなた)がproduct(マスク)を購入したい
まず自身にマスクがあるか確認→ない
次に直接継承しているStore.prototype(カート)をチェック→カート自体にはproduct属性がない
さらにStoreのプロトタイプであるStore.prototype(倉庫)を確認→倉庫にproduct="マスク"が存在
結果:"マスク"が出力される
クロージャー:
---
function items () {
var item = "バックの中の本";
return function () {
console.log(item);
}
}
var bag = items();
bag();
items関数はバックを開けて中に本(item変数)を入れ、小さなメモ(無名関数)を返します。メモには「本を持ってきてくれ」と書かれています。
bag = items():itemsを実行してメモをbagに保存。items関数は終了しますが、メモが本が必要なのでバックは保持されます。
bag():メモを実行すると元のバックから本を取り出し「バックの中の本」と表示します
関数内で関数をネストすると、内部関数は外部関数の変数を記憶できます。これはまるで外出時に家の鍵を小さなバックに入れて持ち歩くようなものです。
スコープ:
----
変数の「領域」です。部屋(関数スコープ)内では部屋にあるものしか見えませんが、玄関(グローバルスコープ)にあるものはドアを開ける(グローバル変数を使用する)ことで見えるようになります。
イベントループ:
-----