JavaScriptにおけるObject.createの引数
ECMAScript5で定義されたObject.createを利用するとコンストラクタ関数とnew演算子を利用する方法以外でオブジェクトを生成することができる。
Object.createを利用する
1 2 3 4 5 6 7 8 9 10 11 | // オブジェクト定義 var Dog = { name: "REON", method: function(){ console.log( "My name is " + this.name); } }; // 新しいオブジェクトを生成 var dog = Object.create(Dog); // 新しいオブジェクトのメソッドの実行 dog.method(); |
上記のようにObject.createに元となるオブジェクトをプロトタイプとして渡すことで、新しいオブジェクトを生成することができる。
但し、そもそもコンストラクタ関数が無いのでコンストラクタ引数に初期値を与えることができない。
Object.createの第二引数
Object.createを利用する上でコンストラクタ引数に相当するものは、第二引数になる。
1 | Object.create(proto [, propertiesObject ]) |
尚、Object.createの第二引数は以下のように形式が厳密に定義されている。
1 2 3 4 5 6 7 8 9 10 | { "プロパティ名": { value : "値", writable : true, configurable : false, enumerable : false, get : function(){}, set : function(){}, } } |
フィールド | 既定値 | 内容 |
---|---|---|
value | undefined | プロパティの値。データディスクリプタのみ。 |
writable | false | trueの場合、値を変更可能。データディスクリプタのみ。 |
configurable | false | trueの場合、ディスクリプタ変更や、オブジェクトからプロパティ削除が可能。 |
enumerable | false | trueの場合、対応するオブジェクトのプロパティ列挙に現れる。 |
get | undefined | Getter関数。アクセサディスクリプタのみ。 |
set | undefined | Setter関数。アクセサディスクリプタのみ。 |
上記の規定に従い、オブジェクト生成時に初期値を与えてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // オブジェクト定義 var Dog = { name: "REON", method: function(){ console.log( "My name is " + this.name); } }; // 新しいオブジェクトを生成(第二引数で初期値の指定やメソッドの追加ができる) var dog = Object.create(Dog, { name: { value: "SANTA" }, bark: { value: function() { console.log(this.name + " is barking."); } } }); // 新しいオブジェクトのメソッドの実行 dog.method(); dog.bark(); |
上記の例では、プロトタイプに定義したnameの値がオブジェクト生成時に指定した値に書き換わっている。
また、同時に新しいメソッド(bark)を追加している。
尚、nameプロパティを書き換え可能にするには、”{value: “SANTA”, writable: true}”のようにwritableフィールドにtrueを設定する必要がある。
同様にプロパティ列挙に表示したい場合やプロパティの削除を可能にしたい場合も、対応するフィールドの設定をtrueに変更する必要がある。