JavaScript метод Object.setPrototypeOf()

Определение и применение

JavaScript метод setPrototypeOf() позволяет установить или изменить прототип указанному объекту.

Обращаю Ваше внимание, что создаваемый объект наследует свойства от прототипа. Каждый объект в Javascript имеет внутреннюю ссылку на другой объект, называемый его прототипом. У объекта-прототипа также может быть свой собственный прототип и так далее до тех пор, пока эта цепочка не завершится объектом, у которого внутренний прототип [[Prototype]] равен null. Это значение указывает на то, что объект не имеет прототипа и является завершающим звеном в цепочке прототипов.

Для того, чтобы получить прототип необходимого объекта Вы можете воспользоваться методом getPrototypeOf().

null и undefined вместо целевого объекта вызывают TypeError; другие примитивы возвращаются без изменений, если прототип допустим. Нельзя создать цикл прототипов или изменить прототип нерасширяемого объекта. Установка уже существующего прототипа допустима. Речь идёт о внутреннем [[Prototype]], а не о свойстве prototype конструктора.

Поддержка браузерами

Спецификация: ecma262

Поддерживается во всех основных браузерах с 2015 года.

Показать браузеры
Совместимостьjavascript.builtins.Object.setPrototypeOf
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
setPrototypeOf✓34✓12✓31✓21✓9✓34✓31✓21✓9✓2.0✓37✓9

поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31

JavaScript синтаксис

JavaScript
Object.setPrototypeOf( obj, proto );

Спецификация

ECMAScript: Object.setPrototypeOf()

Значения параметров

Object: справочные сведения
Параметр Описание
obj Объект, которому необходимо установить или изменить прототип. Обязательный параметр.
proto Объект прототип, который будет установлен, или значение null. Обязательный параметр.

Исключения

Object: справочные сведения
Тип исключения Описание
TypeError Возникает при недопустимом прототипе, цели null или undefined, цикле прототипов либо попытке заменить прототип нерасширяемого объекта другим.

Примеры, попробуйте сами

В примере «Замена унаследованного метода» показан результат вызова метода.

Замена унаследованного метода

Измените свойства исходного объекта и сравните результат до и после вызова метода.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8" />
    <title>Замена унаследованного метода</title>
  </head>
  <body>
    <p>Результат выполнения выводится в консоль.</p>
  </body>
</html>
main.js
JavaScript
let someObject = {
    getName: function () {
        // возвращает значение свойства firstName текущего объекта
        return this.firstName
    },
}

let someObject2 = {
    getName: function () {
        // возвращает значение свойства firstName текущего объекта и конкатенирует строковое значение
        return this.firstName + ' на крюку повис'
    },
}

// создаем новый объект
let myObj = Object.create(someObject, {
    // указываем, что объект прототип соответствует объекту someObject
    firstName: {
        // добавляем новое свойство
        value: 'Boris', // указываем значение свойства
    },
})

console.log(myObj.getName()) // "Boris"
// возвращаем прототип переданного объекта и сравниваем его с объектом someObject
console.log(Object.getPrototypeOf(myObj) === someObject) // true

Object.setPrototypeOf(myObj, someObject2) // изменяем прототип указанному объекту
console.log(myObj.getName()) // "Boris на крюку повис"
// возвращаем прототип переданного объекта и сравниваем его с объектом someObject
console.log(Object.getPrototypeOf(myObj) === someObject2) // true

В этом примере мы инициализировали две переменные, содержащие объекты, каждый из них содержит одноименный метод возвращающий значение свойства firstName текущего объекта в первом случае и значение свойства firstName и некоторое текстовое содержимое во втором.

Далее с использованием метода create() мы создали новый объект с указанным объектом прототипом someObject и одним собственными (неунаследованным) свойством (ключ (атрибут) value устанавливает значение для свойства).

После этого мы с помощью унаследованного свойства (метода getName) выводим в консоль значение свойства firstName. Затем с помощью метода getPrototypeOf() мы возвращаем прототип переданного объекта и проверяем соответствует ли он объекту someObject. Результат проверки будет положительный.

Далее мы с помощью метода setPrototypeOf() изменяем прототип нашему объекту myobj и вызываем унаследованный метод getName.

И наконец с помощью метода getPrototypeOf() мы возвращаем прототип переданного объекта и проверяем соответствует ли он объекту someObject2. Возвращаемое значение при этом будет соответствовать true.