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
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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