Object.create( prototype, descriptors )メソッド

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>

↓↓↓出力結果↓↓↓

アクセサディスクリプタ

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>

↓↓↓出力結果↓↓↓

スポンサード リンク

カテゴリー: JavaScript, Objectオブジェクト, メソッド, リファレンス, 組み込みオブジェクト タグ: パーマリンク