__proto__ 不是克隆手段,仅建立原型链接而非复制数据,存在不安全、非标准、易污染等问题;推荐用 object.create()、展开运算符、structuredclone() 等现代方案。

__proto__ 属性曾被用于手动设置对象的原型,从而实现类似克隆的效果,但它不是实现对象克隆的推荐方式,也不应作为克隆手段使用。
它本质是对象内部 [[Prototype]] 的访问器(getter/setter),指向该对象的原型。你可以用它让一个空对象“继承”另一个对象的属性:
const base = { a: 1, b: 2 };
const clone = {};
clone.__proto__ = base;
console.log(clone.a); // 1 ← 通过原型链读取
但这只是建立了原型链接,并未真正复制数据,且存在明显问题:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
不安全:直接修改
__proto__会触发引擎去优化失效,影响性能 - 非标准:ECMAScript 将其列为附录 B 的可选特性,Node.js 或某些严格环境可能不支持
-
易污染:若
base是内置对象(如Array.prototype)或被多人共享,修改__proto__可能引发意外行为 -
无法控制属性行为:不能像
Object.create()那样用描述符定义writable、enumerable等特性
更关键的是:__proto__ 不等于克隆。它不创建新属性,不隔离引用类型,也不处理构造函数、私有字段或不可枚举属性。所有读取都走原型链,写入基本类型虽不改原对象,但写入数组/对象仍会共用同一份内存:
const base = { list: [] };
const clone = {};
clone.__proto__ = base;
clone.list.push('x');
console.log(base.list); // ['x'] ← 原对象也被改了
现代替代方案更清晰可靠:
- 要建立原型继承关系 → 用
Object.create(proto) - 要浅拷贝自有属性 → 用
{...obj}或Object.assign({}, obj) - 要深拷贝(含嵌套对象、Date、Map 等)→ 用
structuredClone(obj)(ES2022+) - 要兼容老环境且需深拷贝 →
JSON.parse(JSON.stringify(obj))(注意丢失函数、undefined、循环引用)
所以,__proto__ 在克隆场景中已过时,既不实用也不健壮。它更适合调试时查看原型链,而不是用于构建逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










