object.assign只复制源对象自身的可枚举属性,不复制原型链上的属性(包括方法和symbol属性),结果总为普通对象,浅拷贝且不保留原型关系。

Object.assign 不会复制对象的原型属性,它只遍历并拷贝源对象自身的可枚举属性(即 Object.prototype.hasOwnProperty 为 true 且 propertyIsEnumerable 为 true 的属性)。
只处理自有可枚举属性
原型链上的属性(包括继承自 Object.prototype 的方法如 toString、hasOwnProperty,或自定义构造函数原型上的方法)完全被忽略。即使目标对象本身有原型方法,也不会被覆盖或继承过去。
- 例如:
function Person() {};Person.prototype.say = function() {};const p = new Person();Object.assign({}, p)不会把say拷贝进去 - 同理,
Object.assign({a:1}, Object.create({b:2}))得到的是{a:1},不是{a:1, b:2}
无法保留源对象的原型关系
合并后的结果总是一个普通对象([[Prototype]] === Object.prototype),不会继承任何源对象的自定义原型。如果需要保持原型链,不能依赖 Object.assign,而应使用 Object.setPrototypeOf 手动设置,或用 Object.create + Object.assign 组合。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 安全做法:先创建带指定原型的新对象,再赋值属性:
const merged = Object.assign(Object.create(proto), obj1, obj2) - 注意:直接
Object.setPrototypeOf(Object.assign({}, obj), obj.__proto__)可能影响性能,且在严格模式下对不可扩展对象会报错
Symbol 属性会被复制,但仅限自身拥有的
Object.assign 会复制源对象自身定义的 Symbol 属性(只要它们是可枚举的),但不会复制原型上的 Symbol 属性。
- 例如:
const sym = Symbol('key');const a = {[sym]: 123};Object.assign({}, a)→ 包含该 Symbol 属性 - 但如果
a是通过Object.create({[sym]: 456})创建的,则该 Symbol 不会被复制
深拷贝与原型无关,需额外处理
Object.assign 是浅拷贝,对嵌套对象只是复制引用。若嵌套对象本身带有原型方法,这些方法不会因合并而丢失,但也不会被“提升”到顶层对象上——它们仍保留在原嵌套对象内部。
- 比如:
const nested = Object.assign(Object.create({m(){}}), {x:1});Object.assign({}, {data: nested})→result.data仍可调用m(),因为nested原型未变 - 但
result自身没有m方法,也不能通过result.data的原型链以外的方式访问它
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










