应避免修改__proto__,因其破坏V8隐藏类与内联缓存,触发去优化;推荐用Object.create()、class/extends、Proxy和WeakMap替代。

直接操作 __proto__ 会破坏 JavaScript 引擎(尤其是 V8)的隐藏类机制和内联缓存,导致属性访问从毫秒级优化路径退化为动态查找,高频场景下极易引发可感知的卡顿。这不是“可能变慢”,而是明确触发去优化——对象一旦被改 __proto__,所有已 JIT 编译的函数都会失效,后续访问全部走慢路径。
避免在运行时修改 __proto__
-
__proto__是非标准、已被弃用的属性,现代代码应完全避开 - 即使只改一次,也会让该对象及其后续所有访问失去引擎优化能力
- 若多个对象共享原型,改其中一个的
__proto__,可能连带拖慢其他对象性能
用 Object.create() 替代运行时原型替换
- 创建对象时一次性指定原型,零副作用,全程可被引擎优化
- 示例:
const obj = Object.create(MyPrototype),而非obj.__proto__ = MyPrototype - 适合需要定制原型链的初始化场景,比如构造配置对象或轻量级委托实例
优先使用 class / extends 明确继承关系
- 继承结构在编译期/实例化前就确定,引擎能稳定推断隐藏类
- 不仅性能安全,还提升可读性与调试体验
- 例如:
class ApiClient extends HttpClient比手动挂方法到__proto__更可靠
需要动态行为?选 Proxy 而非篡改原型
-
Proxy可拦截get、set等操作,不改动对象真实[[Prototype]] -
instanceof仍正常工作,类型判断不受影响 - 适合实现日志代理、字段校验、响应式包装等,且无性能代价
状态绑定用 WeakMap,别往原型上塞数据
- 向
__proto__添加方法或缓存字段,会污染所有继承链对象 - 改用
const cache = new WeakMap()存储私有状态,既隔离又不影响 GC - 示例:
cache.set(obj, { lastResult: value }),干净、安全、可预测
不复杂但容易忽略


















