Object.create( prototype, descriptors )メソッドは、第1引数「prototype」に指定したオブジェクトをプロトタイプ(原形・模範)とし、第2引数「descriptors」に指定したプロパティを持つ、新たなオブジェクトを生成するメソッド。
構文
Object.create( prototype, descriptors )
引数
- prototype
- プロトタイプ(原形・模範)として使用するオブジェクトを指定。
- プロトタイプが不要の場合、「null」を指定する。
- descriptors
- プロパティのディスクリプタ(enumerable属性、configurable属性)、データディスクリプタ(value属性、writable属性)、アクセサディスクリプタ(get属性、set属性)を指定できる。データディスクリプタとアクセサディスクリプタは、同時には使えない。
- value属性(値属性)
- プロパティの値。
- 初期設定値は「undefined」。
- writable属性(書き込み属性)
- プロパティの値の変更を許可するか。
- 「true」を指定すると値を変更できる。「false」を指定すると値を変更できない。
- 初期設定値は「false」。
- enumerable属性(可算属性)
- オブジェクトをfor文で展開する際に、このプロパティを含めるか。
- 「true」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含める。列挙可能。
- 「false」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含めない。列挙不能。
- 初期設定値は「false」。
- configurable属性(設定属性)
- このプロパティの削除や、上記属性値の変更を許可するか。
- 「true」を指定すると、プロパティ削除や、属性値の変更ができる。「false」を指定すると、プロパティ削除や、属性値の変更ができない。
- 初期設定値は「false」。
- get属性(値属性)
- プロパティの値を返す関数。
- 初期設定値は「undefined」。
- set属性(値属性)
- プロパティの値を設定する関数。
- 初期設定値は「undefined」。
- 省略可能。第2引数を省略するサンプルなどは、「Object.create( prototype )メソッド」のページにて。
戻り値
第1引数「prototype」に指定したオブジェクトをプロトタイプとし、第2引数「descriptors」に指定したプロパティを持つ、新たなオブジェクト。
サンプル
データディスクリプタ
value属性とwritable属性のデータディスクリプタを使ったサンプル。
<script type="text/javascript">
var $sampleObjectA = Object.create(
null,
{
$samplePropA: {
value : 'サンプルA',
// プロパティの値を設定。
writable : true,
// writable属性に「true」を指定すると、プロパティの値を後から変更できる。
enumerable : true,
// 列挙可能。
// enumerable属性に「true」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含める。
configurable : true,
// configurable属性に「true」を指定すると、プロパティ削除や、属性値の変更を許可する。
},
$samplePropB: {
value : 'サンプルB',
// プロパティの値を設定。
writable : false,
// writable属性に「false」を指定すると、プロパティの値を後から変更できない。
enumerable : false,
// 列挙不能。
// enumerable属性に「false」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含めない。
},
$samplePropC: {
value : 'サンプルC',
// プロパティの値を設定。
enumerable : true,
// 列挙可能。
// enumerable属性に「true」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含める。
configurable : false,
// configurable属性に「true」を指定すると、プロパティ削除や、属性値の変更を許可しない。
},
}
);
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />writable(書き込み可能)属性比較<br />' );
$sampleObjectA.$samplePropA = 'さんぷる①';
$sampleObjectA.$samplePropB = 'さんぷる②';
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />enumerable(可算)属性比較<br />' );
for( var $sampleProp in $sampleObjectA ) {
document.write( '$sampleProp:' + $sampleProp + '<br />' );
}
document.write( '<br />configurable(設定)属性比較<br />' );
delete $sampleObjectA.$samplePropA;
delete $sampleObjectA.$samplePropC;
for( var $sampleProp in $sampleObjectA ) {
document.write( '$sampleProp:' + $sampleProp + '<br />' );
}
</script>
var $sampleObjectA = Object.create(
null,
{
$samplePropA: {
value : 'サンプルA',
// プロパティの値を設定。
writable : true,
// writable属性に「true」を指定すると、プロパティの値を後から変更できる。
enumerable : true,
// 列挙可能。
// enumerable属性に「true」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含める。
configurable : true,
// configurable属性に「true」を指定すると、プロパティ削除や、属性値の変更を許可する。
},
$samplePropB: {
value : 'サンプルB',
// プロパティの値を設定。
writable : false,
// writable属性に「false」を指定すると、プロパティの値を後から変更できない。
enumerable : false,
// 列挙不能。
// enumerable属性に「false」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含めない。
},
$samplePropC: {
value : 'サンプルC',
// プロパティの値を設定。
enumerable : true,
// 列挙可能。
// enumerable属性に「true」を指定すると、オブジェクトをfor文で展開する際に、このプロパティを含める。
configurable : false,
// configurable属性に「true」を指定すると、プロパティ削除や、属性値の変更を許可しない。
},
}
);
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />writable(書き込み可能)属性比較<br />' );
$sampleObjectA.$samplePropA = 'さんぷる①';
$sampleObjectA.$samplePropB = 'さんぷる②';
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />enumerable(可算)属性比較<br />' );
for( var $sampleProp in $sampleObjectA ) {
document.write( '$sampleProp:' + $sampleProp + '<br />' );
}
document.write( '<br />configurable(設定)属性比較<br />' );
delete $sampleObjectA.$samplePropA;
delete $sampleObjectA.$samplePropC;
for( var $sampleProp in $sampleObjectA ) {
document.write( '$sampleProp:' + $sampleProp + '<br />' );
}
</script>
↓↓↓出力結果↓↓↓
アクセサディスクリプタ
get属性とset属性のアクセサディスクリプタを使ったサンプル。
set属性を設定したプロパティ「$samplePropA」は、値を後から変更できるが、set属性を設定しなかったプロパティ「$samplePropB」は、値を後から変更できていない点に注目。
<script type="text/javascript">
var $samplePropValueA = 'サンプルA';
var $samplePropValueB = 'サンプルB';
var $sampleObjectA = Object.create(
null,
{
$samplePropA: {
get : function() { return $samplePropValueA; },
// プロパティの値を返す関数を設定。
set : function( $newValue ) { $samplePropValueA = $newValue; },
// プロパティの値を関数で設定。
enumerable : true,
// enumerable属性に「true」を指定すると、
// オブジェクトをfor文で展開する際に、このプロパティを含める。
// 列挙可能。
},
$samplePropB: {
get : function() { return $samplePropValueB; },
// プロパティの値を返す関数を設定。
enumerable : true,
// enumerable属性に「true」を指定すると、
// オブジェクトをfor文で展開する際に、このプロパティを含める。
// 列挙可能。
},
}
);
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />for文で展開<br />' );
for( var $sampleProp in $sampleObjectA ) {
document.write( '$sampleProp:' + $sampleProp + '<br />' );
}
document.write( '<br />writable(書き込み可能)属性比較<br />' );
$sampleObjectA.$samplePropA = 'さんぷる①';
$sampleObjectA.$samplePropB = 'さんぷる②';
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />このサンプルの場合、変数の値を変更するだけでも、値を変更できる。<br />' );
$samplePropValueA = 'SAMPLE(1)';
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
</script>
var $samplePropValueA = 'サンプルA';
var $samplePropValueB = 'サンプルB';
var $sampleObjectA = Object.create(
null,
{
$samplePropA: {
get : function() { return $samplePropValueA; },
// プロパティの値を返す関数を設定。
set : function( $newValue ) { $samplePropValueA = $newValue; },
// プロパティの値を関数で設定。
enumerable : true,
// enumerable属性に「true」を指定すると、
// オブジェクトをfor文で展開する際に、このプロパティを含める。
// 列挙可能。
},
$samplePropB: {
get : function() { return $samplePropValueB; },
// プロパティの値を返す関数を設定。
enumerable : true,
// enumerable属性に「true」を指定すると、
// オブジェクトをfor文で展開する際に、このプロパティを含める。
// 列挙可能。
},
}
);
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />for文で展開<br />' );
for( var $sampleProp in $sampleObjectA ) {
document.write( '$sampleProp:' + $sampleProp + '<br />' );
}
document.write( '<br />writable(書き込み可能)属性比較<br />' );
$sampleObjectA.$samplePropA = 'さんぷる①';
$sampleObjectA.$samplePropB = 'さんぷる②';
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '<br />このサンプルの場合、変数の値を変更するだけでも、値を変更できる。<br />' );
$samplePropValueA = 'SAMPLE(1)';
document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
</script>
↓↓↓出力結果↓↓↓