■オブジェクトを生成
オブジェクトリテラルを使った生成
世間的には一般的である。
var obj = {}; var john = { "name" : "John Norton", "age" : 28, "married" : true };
new演算子を使った生成
個人的には以下のようにnew演算子とコンストラクタ関数を定義する方法が好きだ。
function Person(name, age, married){ this.name = name; this.age = age; this.married = married; } var john = new Person('John Norton', 28, true);
引数の順番が固定なのが嫌なので、以下の様な方法も個人的には使ったりする。
function Person(arg){ this.name = arg.name; this.age = arg.age; this.married = arg.married; } var john = new Person({ "name" : "John Norton", "age" : 28, "married" : true });
■オブジェクトのプロパティ
var book = {}; book.title= "桃太郎"; book.chapter1 = new Object(); book.chapter1.title = "おじいさん芝刈り"; book.chapter2 = { "title" : "おばあさん川へ洗濯" }
プロパティの調査
以下のようにするとユーザ定義のプロパティが調べられる。
function surveyProperties(obj){ var txt = ''; for(var p in obj){ txt .= p + "\n"; } alert(txt); }
但し、継承されたプロパティは返されない。
プロパティの存在確認
存在しないプロパティを参照するとundefinedが返る。
if(john.name !== undefined){ //code }
以下のようにin演算子を使用しても確認できる。
if("name" in john){ //code }
プロパティが存在し、undefined(未定義値)が代入されていた場合、上述のコードは異なった結果をもたらす。
プロパティの削除
以下のようにdelete演算子を使用して、プロパティを削除する。
delete john.name;
■連想配列とオブジェクト
JavaScriptにおける連想配列はオブジェクトのプロパティである。
alert(john.name);//John Norton alert(john['name']);//John Norton
つまりJavaScriptではプロパティの名前を文字列として与えられるので、プログラム中で生成する事が出来る。
■プロパティ
コンストラクタプロパティ
constructorプロパティにはコンストラクタ関数が格納されている。但し、alertした場合は関数名だけでなく内部のコードも表示される。
var date = new Date(); alert(date.constructor === Date);// true function Person(arg){ this.name = arg.name; this.age = arg.age; this.married = arg.married; } var john = new Person({ "name" : "John Norton", "age" : 28, "married" : true }); alert(john.constructor); /* function Person(arg) { this.name = arg.name; this.age = arg.age; this.married = arg.married; } */ alert(john.constructor === Person);//true
以下のようにtypeof演算子を使用して、変数の型を調べられる。
function Person(arg){ this.name = arg.name; this.age = arg.age; this.married = arg.married; } var john = new Person({ "name" : "John Norton", "age" : 28, "married" : true }); if(typeof john ==="object"){ alert('"john" is a Object'); }
以下のようにinstanceof演算子を使用して、任意のクラスのインスタンスかどうかテストできる。
function Person(arg){ this.name = arg.name; this.age = arg.age; this.married = arg.married; } var john = new Person({ "name" : "John Norton", "age" : 28, "married" : true }); if(john instanceof Person){ alert('"john" is instance of Person'); }
■メソッド
hasOwnProperty()メソッド
引数で指定した名前のプロパティを持つかどうかを返す。但し、継承したものはfalseとなる。
function Person(arg){ this.name = arg.name; this.age = arg.age; this.married = arg.married; } var john = new Person({ "name" : "John Norton", "age" : 28, "married" : true }); john.hasOwnProperty('toString');//false john.hasOwnProperty('name');//true
propertyIsEnumerable()メソッド
hasOwnProperty()メソッドでtrueを返し、さらにfor/inループで列挙が可能なものかどうかを返す。
function Person(arg){ this.name = arg.name; this.age = arg.age; this.married = arg.married; } var john = new Person({ "name" : "John Norton", "age" : 28, "married" : true }); john.hasOwnProperty('toString');//false john.hasOwnProperty('name');//true
isPrototypeOf()メソッド
引数で指定したオブジェクトのprototypeオブジェクトであるかどうかを返す。
var john = {}; alert(Object.prototype.isPrototypeOf(john));//true alert(Object.isPrototypeOf(john));//false alert(john.isPrototypeOf(Object.prototype));//false alert(Function.prototype.isPrototypeOf(Object));//true