JavaScript метод Object.setPrototypeOf()
Определение и применение
JavaScript метод setPrototypeOf() позволяет установить или изменить прототип указанному объекту.
Обращаю Ваше внимание, что создаваемый объект наследует свойства от прототипа. Каждый объект в
Javascript имеет внутреннюю ссылку на другой объект, называемый его прототипом. У объекта-прототипа также
может быть свой собственный прототип и так далее до тех пор, пока эта цепочка не завершится объектом, у которого
внутренний прототип [[Prototype]] равен null. Это значение указывает на то, что объект не
имеет прототипа и является завершающим звеном в цепочке прототипов.
Для того, чтобы получить прототип необходимого объекта Вы можете воспользоваться методом
getPrototypeOf().
null и undefined вместо целевого объекта вызывают TypeError; другие примитивы
возвращаются без изменений, если прототип допустим. Нельзя создать цикл прототипов или изменить прототип
нерасширяемого объекта. Установка уже существующего прототипа допустима. Речь идёт о внутреннем
[[Prototype]], а не о свойстве prototype конструктора.
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
setPrototypeOf | 34 | 12 | 31 | 21 | 9 | 34 | 31 | 21 | 9 | 2.0 | 37 | 9 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
Object.setPrototypeOf( obj, proto );
Спецификация
ECMAScript: Object.setPrototypeOf()
Значения параметров
| Параметр | Описание |
|---|---|
obj |
Объект, которому необходимо установить или изменить прототип. Обязательный параметр. |
proto |
Объект прототип, который будет установлен, или значение null. Обязательный параметр.
|
Исключения
| Тип исключения | Описание |
|---|---|
TypeError |
Возникает при недопустимом прототипе, цели null или undefined, цикле прототипов либо попытке заменить прототип нерасширяемого объекта другим. |
Примеры, попробуйте сами
В примере «Замена унаследованного метода» показан результат вызова метода.
Замена унаследованного метода
Измените свойства исходного объекта и сравните результат до и после вызова метода.
index.html
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Замена унаследованного метода</title>
</head>
<body>
<p>Результат выполнения выводится в консоль.</p>
</body>
</html>
main.js
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.