ECMAScript5で定義されたObject.createを利用するとコンストラクタ関数とnew演算子を利用する方法以外でオブジェクトを生成することができる。

【Object.createを利用する】

上記のようにObject.createに元となるオブジェクトをプロトタイプとして渡すことで、新しいオブジェクトを生成することができる。
但し、そもそもコンストラクタ関数が無いのでコンストラクタ引数に初期値を与えることができない。

 

【Object.createの第二引数】

Object.createを利用する上でコンストラクタ引数に相当するものは、第二引数になる。

尚、Object.createの第二引数は以下のように形式が厳密に定義されている。

フィールド既定値内容
valueundefinedプロパティの値。データディスクリプタのみ。
writablefalsetrueの場合、値を変更可能。データディスクリプタのみ。
configurablefalsetrueの場合、ディスクリプタ変更や、オブジェクトからプロパティ削除が可能。
enumerablefalsetrueの場合、対応するオブジェクトのプロパティ列挙に現れる。
getundefinedGetter関数。アクセサディスクリプタのみ。
setundefinedSetter関数。アクセサディスクリプタのみ。

上記の規定に従い、オブジェクト生成時に初期値を与えてみる。

上記の例では、プロトタイプに定義したnameの値がオブジェクト生成時に指定した値に書き換わっている。
また、同時に新しいメソッド(bark)を追加している。
尚、nameプロパティを書き換え可能にするには、”{value: “SANTA”, writable: true}”のようにwritableフィールドにtrueを設定する必要がある。
同様にプロパティ列挙に表示したい場合やプロパティの削除を可能にしたい場合も、対応するフィールドの設定をtrueに変更する必要がある。