p.proto

p.constructor.prototype

Object.getPrototypeOf(p)

补充

补充:三种获取对象原型的方式及差异:

  1. p.__proto__ :历史上 ES6 之前是各浏览器私有的隐藏属性,ES6 规范化为访问器([[Prototype]] 的暴露),允许读写,但官方不推荐直接使用,性能差且语义模糊。
  2. p.constructor.prototype :通过构造函数反查原型,要求 constructor 未被改写;某些场景下原型对象可能没有 constructor 字段,不可靠。
  3. Object.getPrototypeOf(p) :官方推荐的读取方式 (ES5+),返回 p 的原型;对应的写入 API 是 Object.setPrototypeOf(p, proto)。

获取原型上的属性用 Object.getOwnPropertyNames(Proto) 或 Reflect.ownKeys(Proto)。

function Foo() {}
const f = new Foo()
Object.getPrototypeOf(f) === Foo.prototype       // true(推荐)
f.__proto__ === Foo.prototype                    // true(不推荐)
f.constructor.prototype === Foo.prototype        // true(脆弱,依赖 constructor)

来源整理自:vue3js.cn 面试官系列