01. Object Creation

Объекты можно создавать:

  • Через литерал объектов {},

  • При помощи функции Object.create(prototype).

  • При помощи функции-конструктора new Object(),

Три способа создать пустой объект в JS:

const o1 = {};
const o2 = Object.create(null);
const o2 = new Object();

Object Literal Syntax

  • В фигурных скобках перечисляется объект и его синтаксис.

  • Можно дублировать свойства имен, при этом свойство с новым именем перезапишет свойство со старым именем.

Notation in ES5

var o1 = {};
var o2 = {
  a: "foo", // value is string
  b: 42, // value is number
  c: {} // value is other object
};

var a = "foo",
  b = 42,
  c = {};
var o3 = { a: a, b: b, c: c };

var o4 = {
  property: function([parameters]) {},
  get property() {},
  set property(value) {},
  generatorMethod: function*() {}
};

Notation in ES6+

When evaluating the property name from an expression, place the code into square brackets {[expression]: value}. The expression evaluation result becomes the property name.

// Shorthand property names (ES6)
const a = "foo", b = 42, c = {};
const o = { a, b, c };

// Shorthand method names (ES6)
const o = {
  property([parameters]) {},
  get property() {},
  set property(value) {},
  * generator() {}
  ...O
};

// Computed property names (ES6)
const prop = "foo";
const o = {
};

We can evaluate function name:

const methodName = "getFirstName";
const user = {
  // в квадратных скобках может быть любое выражение,
  // которое должно вернуть название метода
  [methodName]() {
    // вместо [methodName]: function() {
    return "Anton";
  }
};

user.getFirstName(); // Anton

Expression can be used to evaluate property names:

const prefix = (prefStr, name) => prefStr + "_" + name;

const object = {};
object[prefix("number", "pi")] = 3.14;
object[prefix("bool", "false")] = false;

object; // => { number_pi: 3.14, bool_false: false }

Object.create()

Метод Object.create(proto, ?propertiesObject) создаёт новый объект с указанными объектом прототипа и свойствами.

const o1 = {};
// эквивалентно этому:
const o2 = Object.create(Object.prototype);

Object.fromEntries()

Создает новый объект из массива entries. Противоположность Object.entries.

Object.fromEntries([['foo',1], ['bar',2]]);
//  {
//    foo: 1,
//    bar: 2,
//  }

Object.fromEntries() is flexible: It accepts iterables (which includes Arrays and is consistent with new Map() etc.). Its [key,value] pairs are only required to be objects that have properties with the keys '0' and '1' (which includes 2-element Arrays).

Object() constructor

Конструктор Object создаёт объект-обёртку для переданного значения. Если значением является null или undefined, создаёт и возвращает пустой объект, в противном случае возвращает объект такого типа, который соответствует переданному значению. Если значение уже является объектом, конструктор вернёт это значение. При вызове как не конструктор, Object ведёт себя идентично коду new Object().

Преобразование в объект выполняется функцией Object():

  • Object() без параметров возвращает {}

  • Object(undefined) или Object(null) возвращает {}

  • Object(bool) => new Boolean(bool)

  • Object(num) => new Number(num)

  • Object(str) => new Boolean(String)

  • Object(obj) => obj

new Object(3); // => new Number(3)
new Object(); // => {}

Last updated