Object.prototype.__proto__
已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。
警告: 更改对象的 [[Prototype]],由于现代 JavaScript 引擎优化属性访问的方式,在所有浏览器和 JavaScript 引擎中目前都是一个非常慢的操作。此外,改变继承的影响是微妙且深远的,不仅限于 obj.__proto__ = ... 语句花费的时间,还可能扩展到任何能够访问到其 [[Prototype]] 被改变的对象的代码。你可以在 JavaScript engine fundamentals: optimizing prototypes 中阅读更多信息。
注意: __proto__ 的使用是有争议且不推荐的。它的存在和确切行为仅作为遗留特性被标准化以确保网络兼容性,但它存在多个 安全问题 和易错点。为了获得更好的支持,请优先使用 Object.getPrototypeOf()/Reflect.getPrototypeOf() 和 Object.setPrototypeOf()/Reflect.setPrototypeOf()。
Object 实例的 __proto__ 访问器属性暴露了该对象的 [[Prototype]](一个对象或 null)。
__proto__ 属性也可以在对象字面量定义中用于在创建时设置对象的 [[Prototype]],作为 Object.create() 的替代。参见:对象初始化器/字面量语法。该语法是标准的,并且在实现中进行了优化,与 Object.prototype.__proto__ 有很大不同。
语法
obj.__proto__
返回值
如果作为 getter 使用,则返回对象的 [[Prototype]]。
异常
描述
__proto__ getter 函数暴露了对象的内部 [[Prototype]] 的值。对于使用对象字面量创建的对象(除非你使用 原型 setter 语法),此值为 Object.prototype。对于使用数组字面量创建的对象,此值为 Array.prototype。对于函数,此值为 Function.prototype。你可以在 继承和原型链 中阅读更多关于原型链的信息。
__proto__ setter 允许修改对象的 [[Prototype]]。提供的值必须是一个对象或 null。提供任何其他值都不会产生任何效果。
与始终在 Object 上作为静态属性可用且始终反映 [[Prototype]] 内部属性的 Object.getPrototypeOf() 和 Object.setPrototypeOf() 不同,__proto__ 属性并不总是存在于所有对象上,因此不能可靠地反映 [[Prototype]]。
__proto__ 属性只是 Object.prototype 上的一个访问器属性,由 getter 和 setter 函数组成。访问 __proto__ 属性并最终查找 Object.prototype 时会找到此属性,但如果访问不经过 Object.prototype,则找不到。如果在查找 Object.prototype 之前找到其他 __proto__ 属性,则该属性将隐藏 Object.prototype 上的那个属性。
null-prototype 对象 不继承 Object.prototype 的任何属性,包括 __proto__ 访问器属性。因此,如果你尝试读取此类对象的 __proto__,无论对象的实际 [[Prototype]] 是什么,该值始终是 undefined。任何对 __proto__ 的赋值都会创建一个名为 __proto__ 的新属性,而不是设置对象的原型。此外,可以通过 Object.defineProperty() 在任何对象实例上将 __proto__ 重新定义为自身的属性,而不会触发 setter。在这种情况下,__proto__ 将不再是 [[Prototype]] 的访问器。因此,始终优先使用 Object.getPrototypeOf() 和 Object.setPrototypeOf() 来设置和获取对象的 [[Prototype]]。
示例
使用 __proto__
function Circle() {}
const shape = {};
const circle = new Circle();
// Set the object prototype.
// DEPRECATED. This is for example purposes only. DO NOT DO THIS in real code.
shape.__proto__ = circle;
// Get the object prototype
console.log(shape.__proto__ === Circle); // false
function ShapeA() {}
const ShapeB = {
  a() {
    console.log("aaa");
  },
};
ShapeA.prototype.__proto__ = ShapeB;
console.log(ShapeA.prototype.__proto__); // { a: [Function: a] }
const shapeA = new ShapeA();
shapeA.a(); // aaa
console.log(ShapeA.prototype === shapeA.__proto__); // true
function ShapeC() {}
const ShapeD = {
  a() {
    console.log("a");
  },
};
const shapeC = new ShapeC();
shapeC.__proto__ = ShapeD;
shapeC.a(); // a
console.log(ShapeC.prototype === shapeC.__proto__); // false
function Test() {}
Test.prototype.myName = function () {
  console.log("myName");
};
const test = new Test();
console.log(test.__proto__ === Test.prototype); // true
test.myName(); // myName
const obj = {};
obj.__proto__ = Test.prototype;
obj.myName(); // myName
规范
| 规范 | 
|---|
| ECMAScript® 2026 语言规范 # sec-object.prototype.__proto__ | 
浏览器兼容性
加载中…