[javascript ECMAScript5] オブジェクトのclone

A.
EMCAScript5では、オブジェクトをcloneする時にその属性にも気をつける必要がある。

hachy.net ECMAScript 5 に追加された新しい関数(Object編)さんのサイトを参考に試してみる。
// add clone function
Object.clone = function (o) {
    var n = Object.create(Object.getPrototypeOf(o));
    var props = Object.getOwnPropertyNames(o);
    var pName;
    for (var p in props) {
        pName = props[p];
        Object.defineProperty(n, pName, Object.getOwnPropertyDescriptor(o, pName));
    };
    return n;
};

// clone test
var obj = Object.create(Object.prototype, {
  id: {
    value: 1,
    configurable: true,
    writable: false,
    enumerable: true
  },
  nickname: {
    enumerable: true,
    configurable: false,
    get : function(){
            console.log("get");
            return this._nickname
          },
    set : function(value){
            console.log("set");
            this._nickname = value
          }
  }
});

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

console.log("clone+++++++++++++++++");

var obj2 = Object.clone( obj );
console.dir( obj2 );
console.log( Object.getOwnPropertyDescriptor(obj2, "id") );
console.log( Object.getOwnPropertyDescriptor(obj2, "nickname") );
実行結果
js_ecma5_clone_1.png
内部属性も同様な状態でコピーできている事が確認できる。

参考サイト
hachy.net ECMAScript 5 に追加された新しい関数(Object編)
IEBlog ECMAScript 5 Part 1: Reusable Code