JavaScript метод create()

JavaScript Object

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

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

Подробную информацию о дескрипторах свойств вы можете получить в описании метода defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.


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


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

МетодChrome
Chrome
Firefox
Firefox
Opera
Opera
Safari
Safari
Internet Explorer
IExplorer
Microsoft Edge
Edge
create()5.04.011.65.09.0Да

JavaScript синтаксис:

// с указанием прототипа объекта
Object.create( proto );

// с указанием прототипа объекта и с объектом, содержащим один или несколько дескрипторов свойств
Object.create( proto, props );

Версия JavaScript

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

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

ПараметрОписание
protoОбъект, который будет использован в качестве прототипа. Может принимать значение null. Необязательный параметр.
propsОбъект, чьи собственные (неунаследованные) перечисляемые свойства представляют собой новые свойства создаваемого объекта, а в качестве значений этих свойств используются дескрипторы. Необязательный параметр.

Исключения

Тип исключенияОписание
TypeErrorВозникает в том случае, если значение параметра proto не является объектом, или значением null. Дескриптор имеет атрибут value или writable, и атрибут get или set. Дескриптор имеет атрибут get или set, который не является функцией.

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

В этом примере мы рассмотрим как создать объект, который не имеет прототипа:

let myObj = Object.create( null, {   // объект-прототип соответствует null
              a: {                   // добавляем новое свойство
                value: 1             // указываем значение свойства
              },
              b: {                   // добавляем новое свойство
                value: 2,            // указываем значение свойства
                enumerable: true     // указываем, что свойство перечислимо 
              }
            });

console.log( myObj ) // {a: 1, b: 2}
Object.keys( myObj ) // ["b"]

В этом примере с использованием метода create() мы создали новый объект с указанным объектом прототипом null и двумя собственными (неунаследованными) свойствами, описываемые дескрипторами.

Ключ (атрибут) value устанавливает значение для свойств, а атрибут enumerable, указанный для свойства "b" соответствует логическому значению, которое определяет отображается ли данное свойство при перечислении свойств объекта в котором оно содержится в цикле for..in, или при вызове метода keys(), который возвращает массив, содержащий имена всех собственных перечислимых (неунаследованных) свойств указанного объекта. Если указано true, то свойство перечисляется, если false, то нет. По умолчанию атрибуты writable, enumerable и configurable получают значение false при добавлении свойств, которые описываются объектом дескрипотором.

В следующем примере мы рассмотрим с Вами как с помощью метода create() указать создаваемому объекту объект, который будет использован в качестве прототипа.

let obj = {
  fullName: function(){
    // возвращает значения свойств текущего объекта firstName и lastName	
    return this.firstName + " " + this.lastName   
  },
  upperCase: function(){
    // возвращает значения свойств текущего объекта firstName и lastName в верхнем регистре	
    return (this.firstName + " " + this.lastName).toUpperCase()   	
  }
}

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

console.log( myObj );                // {firstName: "Boris", lastName: "Britva"}
console.log( myObj.fullName() );     // Boris Britva
console.log( myObj.upperCase() );    // BORIS BRITVA

// проверяем существует ли указанный объ­ект в цепочке прототипов другого объекта
obj.isPrototypeOf( myObj );    // true
myObj.isPrototypeOf( obj );    // false

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

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

После этого мы выводим в консоль содержимое нашего объекта (собственные свойства) и используем по очереди два унаследованных от объекта-прототипа метода. Затем с помощью метода isPrototypeOf() проверяем существует ли указанный объ­ект в цепочке прототипов другого объекта.

Как вы можете заметить объект obj действительно находится в цепочке прототипов объекта myObj (метод возвращает логическое значение true), а объект myObj не находится в цепочке прототипов объекта obj (метод возвращает логическое значение false).

JavaScript Object