利用 defineProperty 与 getOwnPropertyDescriptor 完成对属性的深度复制
Object.defineProperty(Object.prototype, "extend",{ writable:true, enumerable:false, configurable:true, value:function(o){ //获取自有属性 和 可枚举属性 var names = Object.getOwnPropertyNames(o),len; for(var i = 0;len = names.length,i<len;i++){ //属性存在则跳过 if(names[i] in this) continue; //获取其属性对应的描述对象 var oDesc = Object.getOwnPropertyDescriptor(o,names[i]); Object.defineProperty(this,names[i],oDesc); } } });
实例:
var now = Object.defineProperties({},{ "custom":{ writable:false, configurable:false, enumerable:true, value:"被修改了 这么神奇" }, "custom2":{ writable:false, configurable:false, enumerable:true, value:"被修改了 这么神奇" } }); console.log(now); //{ custom: '被修改了 这么神奇', custom2: '被修改了 这么神奇' } // extend 继承 Object.defineProperty(Object.prototype, "extend",{ writable:true, enumerable:false, configurable:true, value:function(o){ //获取自有属性 和 可枚举属性 var names = Object.getOwnPropertyNames(o),len; for(var i = 0;len = names.length,i<len;i++){ //属性存在则跳过 if(names[i] in this) continue; //获取其属性对应的描述对象 var oDesc = Object.getOwnPropertyDescriptor(o,names[i]); Object.defineProperty(this,names[i],oDesc); } } }); var a = {}; a.extend(now); console.log(a); // { custom: '被修改了 这么神奇', custom2: '被修改了 这么神奇' }