[javascript ECMAScript5 メモ] Property Descriptorsまわりのメモ

A.
Property Descriptorsまわりの動作メモ

1. Object.create Property Descriptorデフォルト値の確認
Object.create時にvalueだけ設定した場合configurable,enumerable,writable の値を確認する
var obj = Object.create(Object.prototype, {
  id: { value: 1 }
});
console.log( Object.getOwnPropertyDescriptor(obj, "id") );
console.dir( obj );
結果(Safari 5.0.3 Mac)
jd_pd_1.png

2. オブジェクトリテラルで作成した場合のProperty Descriptorデフォルト値の確認
var obj = {id: 1};
console.log( Object.getOwnPropertyDescriptor(obj, "id") );
console.dir( obj );
結果(Safari 5.0.3 Mac)
js_pd_2.png

3.ゲッター、セッターを使う場合 value, writableは設定できない
get, setとvalueを同時に設定してみる

var obj = Object.create(Object.prototype, {
  id: {
    value: 1,
    enumerable: true,
    configurable: true,
    get : function(){
            return this._id;
          },
    set : function(value){
            this._id = value;
          },
  }
});
結果(Safari 5.0.3 Mac)
js_pd_3.png

get, setとwritableを同時に設定してみる
var obj = Object.create(Object.prototype, {
  id: {
    writable : true,
    enumerable: true,
    configurable: true,
    get : function(){
            return this._id;
          },
    set : function(value){
            this._id = value;
          },
  }
});
結果(Safari 5.0.3 Mac)
js_pd_4.png

4. preventExtensionsで新たにプロパティが追加できなくなるか?
var obj = Object.create(Object.prototype, {
  id: { value: 1,
        configurable: true,
        writable: true,
        enumerable: true
      }
});

// preventExtensionsを設定
console.log( Object.isExtensible( obj ) );
Object.preventExtensions( obj );
console.log( Object.isExtensible( obj ) );

// definePropertyは可能か
Object.defineProperty(obj, "id", {
  configurable: false
});

// 既存のプロパティの値の変更は可能か
console.log( obj.id );
obj.id = 2;
console.log( obj.id );

// 新しくプロパティを追加できるか?
obj.nickname = "max";
/*
Object.defineProperty(obj, "nickname", {
  value : 1
});
*/
結果(Chrome 10.0.648.126 Mac)
js_pd_5.png

5. sealでpreventExtentionsとconfigurableがどのように変わるか
var obj = Object.create(Object.prototype, {
  id: { value: 1,
        configurable: true,
        writable: true,
        enumerable: true
      }
});

// preventExtensionsを設定
console.log( Object.isExtensible( obj ) );
console.log( Object.isSealed( obj ) );
Object.seal( obj );
console.log( Object.isExtensible( obj ) );
console.log( Object.isSealed( obj ) );


// definePropertyは可能か
console.log( Object.getOwnPropertyDescriptor(obj, "id") );
Object.defineProperty(obj, "id", {
  configurable: true
});
console.log( Object.getOwnPropertyDescriptor(obj, "id") );


// 既存のプロパティの値の変更は可能か
console.log( obj.id );
obj.id = 2;
console.log( obj.id );

// 新しくプロパティを追加できるか?
obj.nickname = "max";
結果(Chrome 10.0.648.126 Mac)
js_pd_6.png

6. freezeでpreventExtentionsとconfigurable,writableがどのように変わるか
  id: { value: 1,
        configurable: true,
        writable: true,
        enumerable: true
      }
});

// preventExtensionsを設定
console.log( Object.isExtensible( obj ) );
console.log( Object.isSealed( obj ) );
console.log( Object.isFrozen( obj ) );
Object.freeze( obj );
console.log( Object.isExtensible( obj ) );
console.log( Object.isSealed( obj ) );
console.log( Object.isFrozen( obj ) );

console.log( Object.getOwnPropertyDescriptor(obj, "id") );

// definePropertyは可能か
/*
console.log( Object.getOwnPropertyDescriptor(obj, "id") );
Object.defineProperty(obj, "id", {
  configurable: true
});
console.log( Object.getOwnPropertyDescriptor(obj, "id") );
*/

// 既存のプロパティの値の変更は可能か
console.log( obj.id );
obj.id = 2;
console.log( obj.id );
結果(Chrome 10.0.648.126 Mac)
js_pd_7.png

参考になるサイト
15.2.3.8 Object.seal ( O )
15.2.3.9 Object.freeze ( O )
ECMA-262-5 in detail. Chapter 1. Properties and Property Descriptors.
ECMAScript 5:The Definitive Slides
prog*sig Chapter 16. JavaScript Objects
MSDN Object.defineProperty Function (JavaScript)
ECMA Script 5 の Property Descriptor について話してきました
ECMAScript 5 に追加された新しい関数(Object編)
枕を欹てて聴く ES5, Property Descriptor解説