Object.defineProperty( object, propertyName, descriptor )メソッド

Object.defineProperty( object, propertyName, descriptor )メソッドは、オブジェクトにプロパティを追加したり、既存プロパティを変更したりできるメソッド。

既存プロパティを変更する際は、既存プロパティのconfigurable属性が「true」になっていなければならない。

既存プロパティの値を変更する際は、既存プロパティのwritable属性かconfigurable属性のいずれかが「true」になっていなければならない。

構文

Object.defineProperty( object, propertyName, descriptor )

引数

object
プロパティを追加したり変更したりしたいオブジェクトを指定。
propertyName
追加したり変更したりするプロパティの名前を指定。
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」。

戻り値

変更後のオブジェクト。

サンプル

データディスクリプタ

value属性とwritable属性のデータディスクリプタを使ったサンプル。

<script type="text/javascript">

var $sampleObjectA = Object.create(
    null,
    {
        $samplePropA: {
            value : 'サンプルA',
                // プロパティの値を設定。
            writable : true,
                // writable属性に「true」を指定すると、プロパティの値を後から変更できる。
            enumerable : true,
                // enumerable属性に「true」を指定すると、
                // オブジェクトをfor文で展開する際に、このプロパティを含める。
                // 列挙可能。
        },
        $samplePropB: {
            value : 'サンプルB',
                // プロパティの値を設定。
            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 />Object.definePropertyで変更及び追加<br />' );
Object.defineProperty(
    $sampleObjectA,
    '$samplePropA',
    {
        value : 'さんぷる①',
            // プロパティの値を設定。
    }
);
Object.defineProperty(
    $sampleObjectA,
    '$samplePropC',
    {
        value : 'さんぷる③',
            // プロパティの値を設定。
        enumerable : true,
            // enumerable属性に「true」を指定すると、
            // オブジェクトをfor文で展開する際に、このプロパティを含める。
            // 列挙可能。
    }
);

document.write( '$sampleObjectA.$samplePropA:' + $sampleObjectA.$samplePropA + '<br />' );
document.write( '$sampleObjectA.$samplePropB:' + $sampleObjectA.$samplePropB + '<br />' );
document.write( '$sampleObjectA.$samplePropC:' + $sampleObjectA.$samplePropC + '<br />' );

document.write( '<br />for文で展開<br />' );
for( var $sampleProp in $sampleObjectA ) {
   document.write( '$sampleProp:' + $sampleProp + '<br />' );
}

</script>

↓↓↓出力結果↓↓↓

アクセサディスクリプタ

get属性とset属性のアクセサディスクリプタを使ったサンプル。

<script type="text/javascript">

var $samplePropValueA = 'サンプルA';
var $samplePropValueB = 'サンプルB';
var $sampleObjectB = Object.create(
    null,
    {
        $samplePropA: {
            get : function() { return $samplePropValueA; },
                // プロパティの値を返す関数を設定。
            set : function( $newValue ) { $samplePropValueA = $newValue; },
                // プロパティの値を関数で設定。
            enumerable : true,
                // enumerable属性に「true」を指定すると、
                // オブジェクトをfor文で展開する際に、このプロパティを含める。
                // 列挙可能。
            configurable : true,
        },
        $samplePropB: {
            get : function() { return $samplePropValueB; },
                // プロパティの値を返す関数を設定。
            enumerable : true,
                // enumerable属性に「true」を指定すると、
                // オブジェクトをfor文で展開する際に、このプロパティを含める。
                // 列挙可能。
            configurable : true,
        },
    }
);

document.write( '$sampleObjectB.$samplePropA:' + $sampleObjectB.$samplePropA + '<br />' );
document.write( '$sampleObjectB.$samplePropB:' + $sampleObjectB.$samplePropB + '<br />' );

document.write( '<br />for文で展開<br />' );
for( var $sampleProp in $sampleObjectB ) {
   document.write( '$sampleProp:' + $sampleProp + '<br />' );
}

document.write( '<br />Object.definePropertyで変更及び追加<br />' );
Object.defineProperty(
    $sampleObjectB,
    '$samplePropA',
    {
        get : function(){ return 'さんぷる①'; },
            // プロパティの値を返す関数を設定。
        enumerable : false,
            // enumerable属性に「false」を指定すると、
            // オブジェクトをfor文で展開する際に、このプロパティを含めない。
            // 列挙不能。
    }
);
Object.defineProperty(
    $sampleObjectB,
    '$samplePropC',
    {
        get : function(){ return 'さんぷる③'; },
            // プロパティの値を返す関数を設定。
        enumerable : true,
            // enumerable属性に「true」を指定すると、
            // オブジェクトをfor文で展開する際に、このプロパティを含める。
            // 列挙可能。
    }
);

document.write( '$sampleObjectB.$samplePropA:' + $sampleObjectB.$samplePropA + '<br />' );
document.write( '$sampleObjectB.$samplePropB:' + $sampleObjectB.$samplePropB + '<br />' );
document.write( '$sampleObjectB.$samplePropC:' + $sampleObjectB.$samplePropC + '<br />' );

document.write( '<br />for文で展開<br />' );
for( var $sampleProp in $sampleObjectB ) {
   document.write( '$sampleProp:' + $sampleProp + '<br />' );
}

</script>

↓↓↓出力結果↓↓↓

スポンサード リンク

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