应避免使用__proto__,读取用object.getprototypeof(),设置原型依场景选object.create()或object.setprototypeof(),判断用instanceof/isprototypeof(),初始化时通过extends或reflect.construct()源头设定原型。

直接用 __proto__ 是不合规的。它不是语言标准定义的正式 API,而是浏览器为兼容旧代码保留的遗留特性,ES6 明确将其划入附录 B(仅限浏览器),新项目中应完全避免。
读取原型:统一用 Object.getPrototypeOf()
这是唯一标准化、跨环境一致的读取方式。
- 比
obj.__proto__更可靠:在 Node.js、Deno、Web Worker 等非浏览器环境也能正常工作 - 语义清晰:明确表达“获取对象的 [[Prototype]]”,不混淆内部属性与可编程接口
- 不会触发引擎优化降级,无性能副作用
设置原型:分场景选择标准方法
不能一概而论地“替换为 Object.setPrototypeOf()”——要根据对象生命周期决定。
- 创建新对象时继承某原型 → 用
Object.create(proto, descriptors)。这是最推荐、开销最小的方式 - 已有对象必须变更原型(极少数情况)→ 用
Object.setPrototypeOf(obj, proto)。注意:会破坏 V8 等引擎的隐藏类优化,影响后续属性访问速度 - 绝对不要对普通对象反复调用 setPrototypeOf;若需多态行为,优先考虑组合或代理模式重构
判断原型关系:用 instanceof 或 isPrototypeOf()
替代 obj.__proto__ === SomeConstructor.prototype 这类手动比对。
-
obj instanceof SomeConstructor:适用于构造函数场景,语义准确 -
SomeProto.isPrototypeOf(obj):更通用,支持任意对象作为原型参考,不依赖构造函数 - 两者都符合规范,行为稳定,且被所有现代 JS 引擎深度优化
初始化对象时指定原型:构造器与 class 的写法
如果控制对象创建过程,就应在源头设定原型,而非事后修补。
- 函数构造器中:在
new调用时自动绑定,无需干预 - class 定义中:通过
extends Parent显式声明继承链,原型关系由语法保证 - 使用
Reflect.construct()可精细控制 new 目标和原型,适合高级抽象场景











