Object create
Метод Object.create - это один из методов создания нового объекта в JavaScript.
1Object.create(prototype_object, propertiesObject)
Метод Object.create принимает два аргумента как:
prototypeObject: объект-прототип вновь созданного объекта. Это должен быть объект или ноль.propertiesObject: Свойства нового объекта. Этот аргумент не обязателен
Примечание
Object.create позволяет создать объект без прототипа.
1var person = Object.create(null);23typeof(person) // Object4console.log(person) // Объект с прототипом null56// Устанавливаем свойство name для объекта person7person.name = "John";89console.dir(person) // Объект с свойством name и прототипом null10typeof(person) // Объект с свойством name и прототипом null

Мы создали новый объекта person с помощью метода Object.create. Поскольку мы передали null для Object prototype. Объект person не имеет объекта-прототипа.
Кроме того, мы добавили name в качестве нового свойства к объекту person.
Создание объекта с прототипом
1prototypeObject = {2 fullName: function(){3 return this.firstName + " " + this.lastName4 }5}6var person = Object.create(prototypeObject)78console.log(person) //Объект с прототипом prototypeObject и без свойств910//Добавление свойств к объекту person11person.firstName = "John";12person.lastName = "Doe";1314person.fullName() // John Doe

В примере выше мы создали объект propertiesObject с функцией fullName.
Мы создали объект person с помощью propertiesObject в качестве прототипа объекта person с помощью Object.create.
Далее мы добавили свойства firstName и lastName к объекту person. Мы добавили свойства firstName и lastName после создания объекта.
Для того что бы добавить свойства к объекту при его создание, нужно воспользоваться вторым аргументом propertiesObject в Object.create
propertiesObjectиспользуется для создания свойств нового объекта.
Он действует как дескриптор для определения новых свойств. Дескрипторы могут быть дескрипторами данных или дескрипторами доступа. Дескрипторы данных
- configurable 2.enumerable
- value
- writable
Дескрипторы доступа
- get
- set
Подробно дескрипторы можно прочитать можно тут
1prototypeObject = {2 fullName: function(){3 return this.firstName + " " + this.lastName4 }5}67var person = Object.create(prototypeObject, {8 'firstName': {9 value: "John",10 writable: true,11 enumerable: true12 },13 'lastName': {14 value: "Doe",15 writable: true,16 enumerable: true17 }18})1920console.log(person) // Объект с прототипом prototypeObject и свойствами firstName и lastName

Свойства firstName и lastName были добавлены с помощью 2-го параметра Object.create().
Наследование с использованием Object.create()
1//SuperType constructor function2function SuperType(firstName, lastName){3 this.firstName = "John",4 this.lastName = "Doe"5}67//SuperType prototype8SuperType.prototype.getSuperName = function(){9 return this.firstName + " " + this.lastName;10}1112//SubType prototype function13function SubType(firstName, lastName, age){14 //Наследуем свойства экземпляра15 SuperType.call(this, firstName, lastName);16 this.age = age;17}1819SubType.prototype = Object.create(SuperType.prototype)2021/**22*23* getSubAge должна быть объявлена после SubType.prototype = Object.create(SuperType.prototype) ,24* в противном случае указанная выше строка переопределит этот объект-прототип, и функция getSubAge не будет присутствовать.25*/26SubType.prototype.getSubAge = function() {27 return this.age;28}2930//Create SubType objects31var subTypeObj1= new SubType("John", "Doe", 22);3233//subTypeObj134console.log(subTypeObj1.firstName); //Output: John35console.log(subTypeObj1.age); //Output: 2236console.log(subTypeObj1.getSuperName()); //Output: John Doe37console.log(subTypeObj1.getSubAge()); //Output: 223839console.log(subTypeObj1 instanceof SubType) // Output: true40console.log(subTypeObj1 instanceof SuperType) // Output: true
Мы скопировали прототип SuperType в SubType.prototype, используя Object.create.
Остальное все так же, как наследование в JavaScript.