■オブジェクトを生成
オブジェクトリテラルを使った生成
世間的には一般的である。
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