開眼！Javascript 3章 オブジェクト要点まとめ☆

開眼！Javascript 「3章 オブジェクト」について要点を抜き出し、少し補足して、まとめました。

# 1.Objectオブジェクト

 ビルトインの Object() コンストラクタ関数を利用すると、何の変哲もない空のオブジェクトを生成することができる。

```lang:sample
var cody = {}; // new Object()と同じ
for (key in cody) { 
  if(cody.hasOwnProperty(key)) {
    console.log(key); 
  }
}
```
*cody はプロパティを持たないので、何も出力されない*


>Object() コンストラクタ関数は Function() コンストラクタによって生成されたオブジェクトをベースにしている。
Array() コンストラクタが空の配列を生成するのと同じように、Object()コンストラクタは空のオブジェクトを生成する仕様になっている。
 
# 2.Object() 􏰊􏰋􏰌􏰍􏰎􏰏のパラメータ

 Object() コンストラクタにはひとつ引数を渡すことができる。Object() は与えられた引数の型を判断して適切な型のオブジェクトを生成する。

```lang:sample
var cody1 = new Object();
var cody2 = new Object(undefined);
var cody3 = new Object(null);

console.log(cody1, cody2, cody3);
console.log(typeof cody1, typeof cody2, typeof cody3);
```

*[object Object] [object Object] [object Object]*
*object object object*

引数にnullやundefined以外の値がObject()コンストラクタに渡された場合は、
その値がオブジェクトとして生成される。

Object() コンストラクタを使ってコンストラクタを持つ他のネイティブオブジェクトを生成することができる。

```lang:sample
var ob1 = new Object('foo');
var ob2 = new Object(1);
var ob3 = new Object([]);
var ob4 = new Object(function() {});
var ob5 = new Object(true);
var ob6 = new Object(/\bt[a-z]+\b/);

console.log(ob1,ob2,ob3,ob4,ob5,ob6)
console.log(typeof ob1, typeof ob2, typeof ob3,typeof ob4,typeof ob5,typeof ob6);
```
*foo 1  true [object Object]*
*object object object function object object*

# 3.Object()が持つプロパティとメソッド
Object() オブジェクトは「prototype」のプロパティを持っている。

# 4.Object()のインスタンスのプロパティとメソッド

Object()コンストラクタによって生成されたインスタンスは以下のプロパティとメソッドを持っている。

###インスタンスプロパティ

* constructor

###インスタンスメソッド

* hasOwnProperty(V) 
V に指定した文字列の名前をもつプロパティを、オブジェクト自身が保持している場合に true を返し、自身で保持して いない場合は false を返す。

* isPrototypeOf(V) 
V に指定したオブジェクトのプロトタイプチェーンに自身が含まれているかどうかを判定し、true もしくはfalse を返す。

* propertyIsEnumerable(V) 
Vに指定したプロパティが列挙可能かどうかを判定し、true もしくは false を返す。

* toLocaleString()
toString() と同様の結果を返す。Object() を継承するネイティブオブジェクトが toString() をオーバーライドしている場合にも Object.toString() の結果を返すことができる。

* toString()
 オブジェクトの内容を文字列にして返す。

* valueOf()
オブジェクトに対応するプリミティブ値を返す。オブ ジェクトが対応するプリミティブ型を持たない場合はオブジェクトを返す。

>プロトタイプチェーンは Object.prototype までたどるため、上記のすべてのプロパティとメソッドはすべての JavaScript オブジェクトに継承される。


#5.Object()オブジェクトをオブジェクトリテラルで生成する

「オブジェクトリテラル」とは、{} や { a: 10, b: '20' } のように、波括弧を使用してプロパティを格納した状態の表現を指す。

```lang:sample
// 通常の記法
var cody = new Object();
cody.living = true;
cody.age = 33;
cody.gender = 'male';
cody.getGender = function() { return cody.gender; };

// オブジェクトリテラルの記法
var cody = {
  living: true,
  age: 33,
  gender: 'male',
  getGender: function() { return cody.gender; }
}; // 最後のプロパティの後ろにはカンマをつけないことに注意

```

>以下の条件の場合、プロパティ名をシングルコーテーションで括る必要がある。
・JavaScript の予約語である場合(class など)
・スペース、もしくは特殊文字を含んでいる場合(英数字、$、_(アンダー スコア)以外のすべての文字)
・数字で始まる場合


# 6.すべてのオブジェクトはObject.prototypeから継承する

Object() コンストラクタ関数の prototype プロパティがプロパティチェーンの終着点である。

※ただし例外有り 以下参考
[すべてのオブジェクトがObjectを継承している訳じゃない](http://qiita.com/osakanafish/items/60d020f34a1442989def)

```lang:sample
Object.prototype.foo = 'hello';
var myString = 'empty string';
console.log(myString.foo);
```

*hello*

>Object.prototype に追加したものは、すべてのオブジェクトのプロトタイプチェーンに影響を与え、for-inループでも列挙対象となる。そのため、一般にObject. prototype を編集することは禁止すべきだとも言われている。