HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Object create

Метод Object.create - это один из методов создания нового объекта в JavaScript.

1Object.create(prototype_object, propertiesObject)

Метод Object.create принимает два аргумента как:

  • prototypeObject: объект-прототип вновь созданного объекта. Это должен быть объект или ноль.
  • propertiesObject: Свойства нового объекта. Этот аргумент не обязателен
ℹ️Примечание

Object.create позволяет создать объект без прототипа.

1var person = Object.create(null);
2
3typeof(person) // Object
4console.log(person) // Объект с прототипом null
5
6// Устанавливаем свойство name для объекта person
7person.name = "John";
8
9console.dir(person) // Объект с свойством name и прототипом null
10typeof(person) // Объект с свойством name и прототипом null
Object.create person

Мы создали новый объекта person с помощью метода Object.create. Поскольку мы передали null для Object prototype. Объект person не имеет объекта-прототипа. Кроме того, мы добавили name в качестве нового свойства к объекту person.

Создание объекта с прототипом

1prototypeObject = {
2 fullName: function(){
3 return this.firstName + " " + this.lastName
4 }
5}
6var person = Object.create(prototypeObject)
7
8console.log(person) //Объект с прототипом prototypeObject и без свойств
9
10//Добавление свойств к объекту person
11person.firstName = "John";
12person.lastName = "Doe";
13
14person.fullName() // John Doe
object create with prototype

В примере выше мы создали объект propertiesObject с функцией fullName. Мы создали объект person с помощью propertiesObject в качестве прототипа объекта person с помощью Object.create. Далее мы добавили свойства firstName и lastName к объекту person. Мы добавили свойства firstName и lastName после создания объекта.

Для того что бы добавить свойства к объекту при его создание, нужно воспользоваться вторым аргументом propertiesObject в Object.create

  • propertiesObject используется для создания свойств нового объекта.

Он действует как дескриптор для определения новых свойств. Дескрипторы могут быть дескрипторами данных или дескрипторами доступа. Дескрипторы данных

  1. configurable 2.enumerable
  2. value
  3. writable

Дескрипторы доступа

  1. get
  2. set

Подробно дескрипторы можно прочитать можно тут

1prototypeObject = {
2 fullName: function(){
3 return this.firstName + " " + this.lastName
4 }
5}
6
7var person = Object.create(prototypeObject, {
8 'firstName': {
9 value: "John",
10 writable: true,
11 enumerable: true
12 },
13 'lastName': {
14 value: "Doe",
15 writable: true,
16 enumerable: true
17 }
18})
19
20console.log(person) // Объект с прототипом prototypeObject и свойствами firstName и lastName
object create with prototypeObject and propertiesObject

Свойства firstName и lastName были добавлены с помощью 2-го параметра Object.create().

Наследование с использованием Object.create()

1//SuperType constructor function
2function SuperType(firstName, lastName){
3 this.firstName = "John",
4 this.lastName = "Doe"
5}
6
7//SuperType prototype
8SuperType.prototype.getSuperName = function(){
9 return this.firstName + " " + this.lastName;
10}
11
12//SubType prototype function
13function SubType(firstName, lastName, age){
14 //Наследуем свойства экземпляра
15 SuperType.call(this, firstName, lastName);
16 this.age = age;
17}
18
19SubType.prototype = Object.create(SuperType.prototype)
20
21/**
22*
23* getSubAge должна быть объявлена после SubType.prototype = Object.create(SuperType.prototype) ,
24* в противном случае указанная выше строка переопределит этот объект-прототип, и функция getSubAge не будет присутствовать.
25*/
26SubType.prototype.getSubAge = function() {
27 return this.age;
28}
29
30//Create SubType objects
31var subTypeObj1= new SubType("John", "Doe", 22);
32
33//subTypeObj1
34console.log(subTypeObj1.firstName); //Output: John
35console.log(subTypeObj1.age); //Output: 22
36console.log(subTypeObj1.getSuperName()); //Output: John Doe
37console.log(subTypeObj1.getSubAge()); //Output: 22
38
39console.log(subTypeObj1 instanceof SubType) // Output: true
40console.log(subTypeObj1 instanceof SuperType) // Output: true

Мы скопировали прототип SuperType в SubType.prototype, используя Object.create. Остальное все так же, как наследование в JavaScript.

Hello