淺克隆:只能克隆原始對象自身的值,不能克隆它繼承的值
方法一:
function clone(origin) { return Object.assign({}, origin); }
方法二:
function clone(origin) { return JSON.parse(JSON.stringify(origin)) }
深克隆:克隆對象自身的值和集成的值
方法一:
function clone(origin) { let originProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(originProto), origin); }
方法二:
function clone(obj){ return Object.create( Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj) ) }
方法三: __proto__ 屬性在非瀏覽器環境不一定部署,早期的IE肯定也沒有
function clone(obj){ return { __proto__: Object.getPrototypeOf(obj), ...obj }; }
Object.assign
方法用於對象的合並,將源對象(source)的所有可枚舉屬性,復制到目標對象(target),不包含原型
Object.assign(target, source1, source2);
_proto__
屬性(前后各兩個下划線),用來讀取或設置當前對象的prototype
對象
Object.create()
方法創建一個新對象,使用現有的對象來提供新創建的對象的__proto__
// es6 的寫法 const obj = { method: function() { ... } }; obj.__proto__ = someOtherObj; // es5 的寫法 var obj = Object.create(someOtherObj); obj.method = function() { ... };
Object.setPrototypeOf()
方法的作用與__proto__
相同,用來設置一個對象的prototype
對象,返回參數對象本身。它是 ES6 正式推薦的設置原型對象的方法
Object.getPrototypeOf()該方法與Object.setPrototypeOf
方法配套,用於讀取一個對象的原型對象。
Object.getOwnPropertyDescriptors()
方法,返回指定對象所有自身屬性(非繼承屬性)的描述對象。