変数型
数値 文字列 真偽値 null undefined
変数型 = イミュータブル 一度セットした値を変更できない
オブジェクト
キーによって整理されたミュータブル=変更可能なデータの集合体
配列 関数 正規表現 すべてオブジェクト
クラスの概念を持たない
オブジェクトのプロパティ
名前と値で構成されている
オブジェクトリテラル
{
"first-name" : "jerome",
"last-name": "akutsu"
};
名前:空文字を含む任意の文字列
クオート "" 予約語でなければ省略できる
undefinedのものにたいしてプロパティーを取得しようとするとTypeError
flight.equipment // undefined
flight.equipment.model // thrown TypeError
TypeErrorをさけるために
flight.equipment && flight.equipment.model // undefined
・参照
オブジェクトは参照渡しが行われ、コピーされることはない
var x = stooge;
x.nickname = 'Curly';
var nickname = stooge.nickname;
// x と stoogeは同じオブジェクトを参照しているので nickの値はcurlyになる
var a = {}, b = {}, c = {} // a,b,cはそれぞれ異なる空オブジェクト
・プロトタイプ
全てのオブジェクトはプロトタイプオブジェクトとリンクしていて、そこからプロパティを継承している
オブジェクトリテラルによってつくられたオブジェクトはすべて、js標準のObject.prototypeオブジェクトとリンクしている。
オブジェクト生成の際 プロトタイプとするオブジェクトをせんたくできる。
Object関数にcreateメソッドを追加する
if (typeof Object.create !== 'function') {
Object.create = function(o) {
var F = function() {};
F.prototype = o;
return new F();
};
}
var another_stooge = Object.create(stooge);
オブジェクトの内容を書き換えた際にプロトタイプオブジェクトの内容が変更されることはない
-プロパティーの値の取得の流れ
オブジェクト.name
・オブジェクト自身に指定された名前のプロパティーを探す
・↑なかったら、そのオブジェクトのプロトタイプにさかのぼり探す
・Object.prototypeに行きつくまで検索する
・それでもなかったらundefined
プロトタイプオブジェクトに新しいプロパティを
追加した場合、そのプロパティはその瞬間から、そのオブジェクトをプロトタイプとするオブジェクトすべてにおいてアクセスできる
→プロトタイプチェーンについて調べる
・3.6リフレクション
オブジェクトの中身を調べる方法
typeof 変数型を調べる
but プロトタイプチェーン上に存在するプロパティに対しても利用できてしまう
typeof flight.toString // 'function'
↑取り出したくないプロパティにたいしての操作
これを防ぐ方法
①プログラム中で関数を格納したプロパティだけを無視する
②hasOwnPropertyメソッドを使う
指定された名前のプロパティがそのオブジェクト自身のプロパティだった場合にだけtrue
→hasOwnPropertyメソッドはプロトタイプチェーンをさかのぼらない
3.7プロパティの列挙
for in オブジェクト内に存在するすべてのプロパティ名を順に取り出せる
but 関数やプロトタイプチェーン上のプロパティなど、必要ないものが含まれてるので除く必要がある
①hasOwnPropertyを使う
②typeofを用いて関数を取り除く
var name;
for (name in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln(name + ': ' + another_stooge[name];
}
}
for in は順番が保障されていない
正しい順番で取り出したい場合
プロパティの名前を並べた配列を用意する
3.8 プロパティの削除
delete演算子を使うとプロパティを削除できる
3.9 グローバル領域の利用を減らす
グローバル変数はプログラムの柔軟性を弱めるので使うべきでない
グローバル変数を最低限にする方法の1つ
・アプリケーションのためにグローバル変数を1つだけ定義
var MYAPP = {};
↑これをアプリケーションのコンテナとして利用する
MYAPP.stooge = {
"first-name" : "Joe",
"last-name" : "howard"
};
ほかのアプリケーションやウィジェット・ライブラリと悪影響を与えあう可能性を劇的に減らせる。