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__ 有很大不同。

語法

js
obj.__proto__

返回值

如果作為 getter 使用,則返回物件的 [[Prototype]]

異常

TypeError

嘗試設定一個 不可擴充套件物件不可變原型奇異物件(例如 Object.prototypewindow)的原型時會丟擲錯誤。

描述

__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__

js
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
js
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
js
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
js
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__

瀏覽器相容性

另見