Spec-Zone.ru › JavaScript

Object.prototype.__proto__

Базовый стандарт Ограниченная доступность

Эта функция не является базовым стандартом, так как она не работает в некоторых наиболее широко используемых браузерах.

Устарело: Эта функция больше не рекомендуется. Хотя некоторые браузеры могут по-прежнему поддерживать ее, она могла быть удалена из соответствующих веб-стандартов, находится в процессе удаления или сохранена только для целей совместимости. Избегайте ее использования и, по возможности, обновите существующий код; см. таблицу совместимости внизу этой страницы, чтобы помочь вам принять решение. Имейте в виду, что эта функция может перестать работать в любое время.

Предупреждение: Изменение [[Prototype]] объекта по своей природе, из-за того, как современные движки JavaScript оптимизируют доступ к свойствам, в настоящее время является очень медленной операцией во всех браузерах и движках JavaScript. Кроме того, последствия изменения цепочки прототипов являются тонкими и далеко идущими, и не ограничиваются временем, затраченным в операторе obj.__proto__ = ..., но могут распространяться на любой код, который имеет доступ к любому объекту, чья [[Prototype]] была изменена. Вы можете прочитать больше в Основы движка JavaScript: оптимизация прототипов.

Примечание: Использование __proto__ является спорным и не рекомендуется. Его существование и точное поведение были стандартизированы только как устаревшая функция для обеспечения совместимости с веб-сайтами, в то время как оно представляет несколько проблем безопасности и ловушек. Для лучшей поддержки вместо этого предпочтите Object.getPrototypeOf()/Reflect.getPrototypeOf() и Object.setPrototypeOf()/Reflect.setPrototypeOf().

Аксессорное свойство __proto__ экземпляров Object раскрывает [[Prototype]] (объект или null) этого объекта.

Свойство __proto__ также может использоваться в определении литерала объекта для установки [[Prototype]] объекта при создании, как альтернатива Object.create(). См.: инициализатор объекта / синтаксис литерала. Этот синтаксис является стандартным и оптимизированным для реализаций, и сильно отличается от Object.prototype.__proto__.

Синтаксис

obj.__proto__

Возвращаемое значение

При использовании в качестве геттера возвращает [[Prototype]] объекта.

Исключения

TypeError
Выбрасывается при попытке установить прототип нерасширяемого объекта или экзотического объекта с неизменяемым прототипом, такого как Object.prototype или window.

Описание

Функция геттера __proto__ раскрывает значение внутреннего [[Prototype]] объекта. Для объектов, созданных с использованием литерала объекта (если вы не используете синтаксис сеттер прототипа), это значение равно Object.prototype. Для объектов, созданных с использованием литералов массива, это значение равно Array.prototype. Для функций это значение равно Function.prototype. Вы можете прочитать больше о цепочке прототипов в Наследование и цепочка прототипов.

Сеттер __proto__ позволяет изменять [[Prototype]] объекта. Предоставленное значение должно быть объектом или null. Предоставление любого другого значения ни к чему не приведет.

В отличие от Object.getPrototypeOf() и Object.setPrototypeOf(), которые всегда доступны в Object в виде статических свойств и всегда отражают внутреннее свойство [[Prototype]], свойство __proto__ не всегда существует как свойство на всех объектах, и в результате не надежно отражает [[Prototype]].

Свойство __proto__ — это всего лишь свойство аксессора в Object.prototype, состоящее из функции геттера и сеттера. Обращение к свойству для __proto__, которое в конечном итоге обращается к Object.prototype, найдет это свойство, но обращение, которое не обращается к Object.prototype, не найдет. Если какое-либо другое свойство __proto__ найдено до того, как будет обращено к Object.prototype, это свойство скроет то, которое найдено в Object.prototype.

Объекты с прототипом-null null не наследуют никаких свойств от Object.prototype, включая свойство аксессора __proto__, поэтому если вы попытаетесь прочитать __proto__ на таком объекте, значение всегда будет undefined независимо от фактического [[Prototype]] объекта, а любое присваивание __proto__ вместо установки прототипа объекта создаст новое свойство с именем __proto__. Кроме того, __proto__ можно переопределить как собственное свойство любого экземпляра объекта через Object.defineProperty() без вызова сеттера. В этом случае __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® 2027 Language Specification
# sec-object.prototype.__proto__

Совместимость с браузерами

Настольные компьютеры Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
proto
1
12
1
10.5
3
18
4
11
1
1.0
4.4
1
1.0.0
2.9
1.39
0.10.0

См. также

  • Object.prototype.isPrototypeOf()
  • Object.getPrototypeOf()
  • Object.setPrototypeOf()
  • Атака загрязнения прототипа

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API