開眼!Javascript 「3章 オブジェクト」について要点を抜き出し、少し補足して、まとめました。
1.Objectオブジェクト
ビルトインの Object() コンストラクタ関数を利用すると、何の変哲もない空のオブジェクトを生成することができる。
var cody = {}; // new Object()と同じ
for (key in cody) {
if(cody.hasOwnProperty(key)) {
console.log(key);
}
}
cody はプロパティを持たないので、何も出力されない
Object() コンストラクタ関数は Function() コンストラクタによって生成されたオブジェクトをベースにしている。
Array() コンストラクタが空の配列を生成するのと同じように、Object()コンストラクタは空のオブジェクトを生成する仕様になっている。
2.Object() のパラメータ
Object() コンストラクタにはひとつ引数を渡すことができる。Object() は与えられた引数の型を判断して適切な型のオブジェクトを生成する。
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() コンストラクタを使ってコンストラクタを持つ他のネイティブオブジェクトを生成することができる。
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' } のように、波括弧を使用してプロパティを格納した状態の表現を指す。
// 通常の記法
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を継承している訳じゃない
Object.prototype.foo = 'hello';
var myString = 'empty string';
console.log(myString.foo);
hello
Object.prototype に追加したものは、すべてのオブジェクトのプロトタイプチェーンに影響を与え、for-inループでも列挙対象となる。そのため、一般にObject. prototype を編集することは禁止すべきだとも言われている。