ES6 完全克隆一个对象并且拷贝其原型对象属性

一. Object.getPrototypeOf()用法

 Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。

语法

Object.getPrototypeOf(object)

参数

obj
 要返回其原型的对象。

返回值

 给定对象的原型。如果没有继承属性,则返回 null

二. Object.assign()用法

 Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

语法

Object.assign(target, ...sources)

参数

target
 目标对象。
sources
 源对象。

返回值

 目标对象。

三. Object.create()用法

 Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的proto

语法

Object.create(proto[, propertiesObject])

参数

proto
 新创建对象的原型对象。
propertiesObject
 可选。如果没有指定为 undefined,则是要添加到新创建对象的不可枚举(默认)属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。

返回值

 一个新对象,带着指定的原型对象和属性。

例外

 如果propertiesObject参数是 null或非原始包装对象,则抛出一个 TypeError 异常。

四 . Object.getOwnPropertyDescriptors()用法

 Object.getOwnPropertyDescriptors()方法用来获取一个对象的所有自身属性的描述符。

语法

Object.getOwnPropertyDescriptors(obj)

参数

obj
 任意对象。

返回值

 所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。

五. 克隆对象

// 写法一
const clone1 = {
  __proto__: Object.getPrototypeOf(obj),
  ...obj
};

// 写法二
const clone2 = Object.assign(
  Object.create(Object.getPrototypeOf(obj)),
  obj
);

// 写法三
const clone3 = Object.create(
  Object.getPrototypeOf(obj),
  Object.getOwnPropertyDescriptors(obj)
)
// 建议二、三写法。

题外内容

浅拷贝一个对象

Object.assign() 方法只能拷贝源对象的可枚举的自身属性,同时拷贝时无法拷贝属性的特性们,而且访问器属性会被转换成数据属性,也无法拷贝源对象的原型,该方法配合 Object.create()方法可以实现上面说的这些。

Object.create(
  Object.getPrototypeOf(obj), 
  Object.getOwnPropertyDescriptors(obj) 
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。