JavaScript метод setPrototypeOf()ECMAScript 2015

JavaScript Object

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

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

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


Указание прототипа может снизить производительностиь кода JavaScript, имеющего доступ к объекту, прототип которого был изменен. Метод ничего не делает, если параметр prototype не является объектом или null.


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

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

МетодChrome
Chrome
Firefox
Firefox
Opera
Opera
Safari
Safari
Internet Explorer
IExplorer
Microsoft Edge
Edge
setPrototypeOf()34.031.0Да9.011.0Да

JavaScript синтаксис:

Object.setPrototypeOf( obj, proto );

Версия JavaScript

ECMAScript 5.1 (реализовано в JavaScript 1.8.5)

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

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

Исключения

Тип исключенияОписание
TypeErrorВозникает в том случае, если объект, чей прототип должен быть изменен является нерасширяемым.

Пример использования

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()ECMAScript 2015 изменяем прототип нашему объекту myobj и вызываем унаследованный метод getName.

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

JavaScript Object