mikhailbalin
5/3/2019 - 9:45 AM

JavaScript

JS Help

Types:

  1. String
  2. Boolean
  3. Number
  4. BigInt
  5. Symbol
  6. null
  7. undefined
  8. object

Engine: byte stream stream decoder πŸ‘‰ tokens parser πŸ‘‰ Abstract Syntax Tree interpreter πŸ‘‰ byte code optimizing compiler

Event Loop: callstack queue event loop

map, filter and slice return a new array find returns an element reduce returns a reduced value push returns length

TypeErrors get thrown when a value is not of the expected type. SyntaxErrors get thrown when you've written something that isn't valid JavaScript, for example when you've written the word return as retrun. ReferenceErrors get thrown when JavaScript isn't able to find a reference to a value that you're trying to access.

bind() only returns a copy of the bound function call() executes the bound function immediately

Falsy values:

  1. undefined
  2. null
  3. NaN
  4. 0, -0
  5. '' (empty string)
  6. false

public - доступны ΠΊΠ°ΠΊ Π² классах, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, Ρ‚Π°ΠΊ ΠΈ Π² классах ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ…. Π’Π°ΠΊΠΆΠ΅ ΠΊ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· экзСмпляры класса protected - доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ контСксту класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ всСм Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌ. НС доступны Ρƒ экзСмпляров private - доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ контСксту класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹. НС доступны Ρƒ экзСмпляров ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

abstract - создаСтся класс, Π² Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с абстракными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΈ ΠΈΡ… Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ readonly - нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρƒ экзСмпляров

static - Π½Π΅Ρ‚ Ρƒ инстансов

Keywords

  • infer - returns a type from a generic

Для вставки ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°ΠΊΠΎΠ² Π² строки, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ / ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌΠΈ, называСтся escaping:

"He said \"Hi!\""; // He said Hi!
'He said "Hi!"'; // He said Hi!
`He said \'Hi!\'`; // Wrong punctuatin, but just for example

Бписок Ρ‚Π°ΠΊΠΈΡ… Π·Π½Π°ΠΊΠΎΠ² (escape sequences) вмСстС с символами ****\u *hhhh* Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Unicode с ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌ (hexadecimal) ΠΊΠΎΠ΄ΠΎΠΌ:

Unicode character valueEscape sequenceMeaningCategory
\u0008\bBackspace
\u000C\fForm feedWhite space
\u000A\nLine feed (new line)Line terminator
\u000D\rCarriage returnLine terminator
\u0009\tTabWhite space
\u000B\vVertical tabWhite space
\u0027'Single quotation mark (')
\u0022"Double quotation mark (")
\u005C\Backslash
\u0020SpaceWhite space
\u00A0Nonbreaking spaceWhite space
\u2028Line separatorLine terminator
\u2029Paragraph separatorLine terminator
\uFEFFByte order markWhite space

JavaScript ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ встроСнных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² матСматичСского присваивания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ вычислСниС Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ Π΅ΠΌΡƒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π±Π΅Π· записи ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π²Π°ΠΆΠ΄Ρ‹:

let x = 4;
x += 2; // x equals 6

let y = 4;
y -= 2; // y equals 2

let z = 4;
z *= 2; // z equals 8

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚

Одной ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ частых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² JavaScript, ΠΊΠ°ΠΊ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, являСтся ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ++ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π° 1:

let i = 2;
i++;      // Π±ΠΎΠ»Π΅Π΅ короткая запись для i = i + 1.
console.log(i); // 3

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ -- ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π° 1:

let i = 2;
i--;      // Π±ΠΎΠ»Π΅Π΅ короткая запись для i = i - 1.
console.log(i); // 1

Π’Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i++ (постфиксная Ρ„ΠΎΡ€ΠΌΠ°), Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ++i (прСфиксная Ρ„ΠΎΡ€ΠΌΠ°).

ОбС эти Ρ„ΠΎΡ€ΠΌΡ‹ записи Π΄Π΅Π»Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. Но Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΈ ΠΎΠ½Π° Π²ΠΈΠ΄Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

let i = 1;
let a = ++i;

console.log(a);
// -> 2

Π’Ρ‹Π·ΠΎΠ² ++i ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² a. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² a ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i послС увСличСния.

ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° i++ отличаСтся ΠΎΡ‚ прСфиксной ++i Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π±Ρ‹Π²ΡˆΠ΅Π΅ Π΄ΠΎ увСличСния. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ Π² a ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i, Ρ€Π°Π²Π½ΠΎΠ΅ 1:

let i = 1;
let a = i++;

console.log(a);
// -> 1

Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π° Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ – Π±Π΅Π· Ρ€Π°Π·Π½ΠΈΡ†Ρ‹, ΠΊΠ°ΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

let i = 0;
i++;
++i;
console.log(i);
// -> 2

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π»ΡŽΠ±Ρ‹Ρ… выраТСниях. ΠŸΡ€ΠΈ этом ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ выполняСтся Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

let i = 1;
console.log(2 * ++i);
// -> 4

let i = 1;
console.log( 2 * i++);
// -> 2,  выполнился Ρ€Π°Π½ΡŒΡˆΠ΅ Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π΅Ρ€Π½ΡƒΠ» староС

console.log(i);
// -> 2

console.log(2 * i++);
// -> 4

console.log(i);
// -> 3

Π­ΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

Новый Π² ES7 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ** позволяСт Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ:

const square = (x) => x**2;
square(2);
// -> 4

ВыраТСния, утвСрТдСния ΠΈ срСда

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (expression - Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) соотносится с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚, Ρ‚ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ (statement) соотносится с Ρ†Π΅Π»Ρ‹ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π½Π°Π±ΠΎΡ€ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ.

Π‘Π°ΠΌΡ‹ΠΉ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ утвСрТдСния это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ; послС Π½Π΅Π³ΠΎ:

1;
!false;

Π’ΠΎΡ‡ΠΊΡƒ запятой ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ всСгда, Π½ΠΎ слоТно ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π°, ΠΏΠΎ-этому Π»ΡƒΡ‡ΡˆΠ΅ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всСгда.

Π‘Ρ€Π΅Π΄Π° (environment) - это Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹. БистСмы JavaScript всСгда ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ ряд ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… стандартных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π²Π°ΡˆΡƒ срСду.

Бвойства

Instance (экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) - это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ случай (ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚) Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ строка Hello, содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

ΠŸΠΎΡ‡Ρ‚ΠΈ всС значСния Π² JavaScript ΠΈΠΌΠ΅ΡŽΡ‚ свойства. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся null ΠΈ undefined:

null.length;
// -> TypeError: null has no properties

МоТно Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ количСство символов Π² строкС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ свойства .length:

console.log('Hello'.length);

А Ρ‚Π°ΠΊ ΠΆΠ΅ .log являСтся свойством Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ console.log.

Π”Π²Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… способа доступа ΠΊ свойствам Π² JavaScript - это Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки. Оба value.x ΠΈ value[x] ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ свойству value, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅. Π Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ интСрпрСтируСтся. ΠŸΡ€ΠΈ использовании Ρ‚ΠΎΡ‡ΠΊΠΈ, слово послС Ρ‚ΠΎΡ‡ΠΊΠΈ являСтся Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ свойства. ΠŸΡ€ΠΈ использовании ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ скобками оцСниваСтся (evaluats) для получСния ΠΈΠΌΠ΅Π½ΠΈ свойства.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π½Π°Π·Π²Π°Π½ΠΈΠ΅ свойства name, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ value.name. Если Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ свойство Π½Π°Π·Π²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ значСния Π·Π°Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ value[i]. Бвойством ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любая строка, Π½ΠΎ нотация с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (dot notation) Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ свойству, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌΡƒ β€œ2” ΠΈΠ»ΠΈ β€œJohn Doe”, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки: value[2] ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ["John Doe"].

На March 2, 2018 список всСх свойств JavaScript Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° MDN насчитываСт 127 страниц.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ экзСмпляров ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π» создан экзСмпляр, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π΅Π· экзСмпляра, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JavaScript. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ содСрТат ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π΅ создавая экзСмпляр.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° [Math](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math) являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ, содСрТащая матСматичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΡ…ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ .random(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайноС число:

console.log(Math.random()); // random number between 0 and 1

МоТно Π·Π°Π΄Π°Ρ‚ΡŒ число Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° производится гСнСрация просто ΡƒΠΌΠ½ΠΎΠΆΠΈΠ² Π½Π° Π½Π΅Π³ΠΎ:

Math.random() * 50;

Π’ этом случаС ΠΎΡ‚Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ скорСС всСго дСсятичным числом. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ΡŒ число, Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Math.floor():

Math.floor(Math.random() * 50);

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΡƒΡ‚.

Curring

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² Ρ„ΡƒΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΡ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ:

const multiply = (a, b) => a * b;
multiply(3, 4);
// -> 12

const curriedMultiply = (a) => (b) => a * b; // стрСлки это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

// старая вСрсия
var curriedMultiply = function curriedMultiply(a) {
  return function (b) {
    return a * b;
  };
};

// Ρ‚ΠΎΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ closure
curriedMultiply(3)(4);
// -> 12

const multiplyBy5 = curriedMultiply(5);
multiplyBy5(5)
// -> 25

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ пСрвая функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ a ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΡƒΡŽ функция, которая ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ a ΠΈ b.

Compose

БлияниС Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ, для формирования Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ для Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

const compose = (f, g) => (a) => f(g(a));

const sum = (num) => num + 1;

compose(sum, sum)(5);

// 1. const compose = (f, g) => (a) => f(g(5));
// 2. const compose = (f, g) => (a) => f(6);
// 3. const compose = (f, g) => (a) => 7;

// старая вСрсия, f & g становятся функциями
var compose = function compose(f, g) {
  return function (a) {
    return f(g(a));
  }
};

var sum = function sum(num) {
  return num + 1
};

compose(sum, sum)(5);

Generators

Generators are a special kind of function with the ability to pause itself, and resume later, allowing other code to run in the meantime.

The code decides that it has to wait, so it lets other code β€œin the queue” to run, and keeps the right to resume its operations β€œwhen the thing it’s waiting for” is done.

All this is done with a single, simple keyword: yield. When a generator contains that keyword, the execution is halted.

A generator can contain many yield keywords, thus halting itself multiple times, and it’s identified by the *function keyword, which is not to be confused with the pointer dereference operator used in lower level programming languages such as C, C++ or Go.

Generators enable whole new paradigms of programming in JavaScript, allowing:

  • 2-way communication while a generator is running
  • long-lived while loops which do not freeze your program

Here is an example of a generator which explains how it all works.

function *calculator(input) {
    var doubleThat = 2 * (yield (input / 2))
    var another = yield (doubleThat)
    return (input * doubleThat * another)
}

We initialize it with

const calc = calculator(10)

Then we start the iterator on our generator:

calc.next()

This first iteration starts the iterator. The code returns this object:

{
  done: false
  value: 5
}

What happens is: the code runs the function, with input = 10 as it was passed in the generator constructor. It runs until it reaches the yield, and returns the content of yield: input / 2 = 5. So we got a value of 5, and the indication that the iteration is not done (the function is just paused).

In the second iteration we pass the value 7:

calc.next(7)

and what we got back is:

{
  done: false
  value: 14
}
7 was placed as the value of doubleThat. Important: you might read like input / 2 was the argument, but that’s just the return value of the first iteration. We now skip that, and use the new input value, 7, and multiply it by 2.

We then reach the second yield, and that returns doubleThat, so the returned value is 14. In the next, and last, iteration, we pass in 100

calc.next(100)

and in return we got

{
  done: true
  value: 14000
}

As the iteration is done (no more yield keywords found) and we just return (input * doubleThat * another) which amounts to 10 * 14 * 100.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (objects) JavaScript - это ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ свойств) ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π”Π°Π½Π½Ρ‹Π΅, хранящиСся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Π½Π΅ упорядочСны - ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° связанного с Π½ΠΈΠΌ ΠΊΠ»ΡŽΡ‡Π° (key).

МоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (key-value), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

let restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine Pesto'],
  open: function() { // это ΠΈ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄
    console.log('${this.name} is open!');
  }
};

ОписаниС:

  1. let restaurant создаСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ restaurant, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
  2. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ создаСтся Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках {}.
  3. name, seatingCapacity, hasDineInSpecial, ΠΈ entrees это всС ΠΊΠ»ΡŽΡ‡ΠΈ.
  4. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ с Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ :.
  5. КаТдая ΠΏΠ°Ρ€Π° раздСляСтся запятой ,.

Доступ ΠΊ свойствам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

НаиболСС распространСнным способом доступа ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π° являСтся использованиС Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠΉ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ (dot notation).

let restaurant = {
  name: 'Italian Bistro',
  'seating capacity': 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto']
};

console.log(restaurant.entrees);
// -> ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto']

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ доступа ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π° - это ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ скобок.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ с Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠΉ Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скобки открытия [ ΠΈ закрытия ] для доступа ΠΊ ΠΊΠ»ΡŽΡ‡Ρƒ. Бинтаксис выглядит Ρ‚Π°ΠΊ:

let restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto']
};

console.log(restaurant['entrees']);
// -> ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto']

Одно прСимущСство Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ со скобками Π½Π°Π΄ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠΉ Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ скобок для Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

let meal = 'none';
let time = 12;
// We'll use military time for this example, counting hours 0-23.

const restaurantSpecials = {
 breakfast: 'The breakfast special is 20% off freshly squeezed orange juice',
 lunch: 'The lunch special is 10% off appetizers',
 none: 'There are no specials currently'
};

if (time < 11) { // 11 am
  meal = 'breakfast';
} else if (time < 17) { // 5 pm
  meal = 'lunch';
}

console.log(restaurantSpecials[meal]);
// -> The lunch special is 10% off appetizers

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ свойств

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹ΠΌΠΈ (mutable), Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ послС создания. Π”Π°ΠΆΠ΅ Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сохранСн Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ const, всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ, Π½Π΅ вызывая ошибки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

const restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto']
}

МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ appetizers ΠΈ desserts ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

restaurant['appetizers'] = ['Fried Calamari', 'Bruschetta'];
restaurant.desserts = ['Homemade Tiramisu', 'Cannoli'];

МоТно Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния, Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для appetizers ΠΈ desserts Π½ΠΎΠ²Ρ‹ΠΌΠΈ массивами:

restaurant['appetizers'] = ['Fried Calamari', 'Bruschetta', 'Caprese Salad'];
restaurant.desserts = ['Homemade Tiramisu', 'Canolli', 'Cheesecake'];

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹

Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-функция, функция называСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ (method):

const restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto'],
  openRestaurant: () => {
    return 'Unlock the door, flip the open sign. We are open for business!';
  },
  closeRestaurant: () => {
    return 'Lock the door, flip the open sign. We are closed.'
  }
};

console.log(restaurant.openRestaurant());
// -> Unlock the door, flip the open sign. We are open for business!

console.log(restaurant.closeRestaurant());
// -> Lock the door, flip the open sign. We are closed.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ созданы Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° .openRestaurant() ΠΈ .closeRestaurant(), ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ синтаксиса со стрСлкой Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ restaurant.

Новый синтаксис ES6 Новый синтаксис записи ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ нуТдаСтся Π² стрСлках ΠΈ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠΈ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

const restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto'],

  openRestaurant() {
    return 'Unlock the door, flip the open sign. We are open for business!';
  },
  closeRestaurant() {
    return 'Lock the door, flip the open sign. We are closed.'
  }

А Ρ‚Π°ΠΊ ΠΆΠ΅, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ значСниям ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

const obj =  {
  player: 'bobby',
  experience: 100,
  wizardLevel: false
}

const player = obj.player;
const experience = obj.experience;
let wizardLevel = obj.wizardLevel;

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ синтаксис (destructuring):

const {player, experience} = obj;
let {wizardLevel} = obj;

player
// -> bobby

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ динамичСскиС свойства (dynamic properties), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

const name = 'john snow';
const property = 'Property';

const obj = {
  [name]: 'Bob',
  [1 + 3]: 'result',
  [`get${property}`]() {
    return this[name];
  }
}

obj[name]
obj[`get${property}`]()
// -> "Bob"

Иногда Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ свойства Π±Ρ‹Π»ΠΈ Ρ€Π°Π²Π½Ρ‹ значСниям:

const a = "Simon";
const b = true;
const c = {};

const obj = {
  a: a,
  b: b,
  c: c,
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‚Π°ΠΊ:

const obj = {a, b, c}

ДСскриптор this

МоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ свойство hasDineInSpecial Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ .openRestaurant():

const restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto'],
  openRestaurant() {
    if (hasDineInSpecial) {
      return 'Unlock the door, post the special on the board, then flip the open sign.';
    } else {
      return 'Unlock the door, then flip the open sign.';
    }
  }
};

console.log(restaurant.openRestaurant());
// -> ReferenceError: hasDineInSpecial is not defined

Ошибка происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ hasDineInSpecial Π²Π½Π΅ области дСйствия .openRestaurant().

НуТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ дСскриптор this Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ свойствам Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

const restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto'],
  openRestaurant: function() {
    if (this.hasDineInSpecial) {
      return 'Unlock the door, post the special on the board, then flip the open sign.'
    } else {
      return 'Unlock the door, then flip the open sign.'
    }
  }
}

console.log(restaurant.openRestaurant());
// -> Unlock the door, post the special on the board, then flip the open sign.

this.hasDineInSpecial Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° это Ρ‚ΠΎΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ restaurant.hasDineInSpecial Π²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.


Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this, ΠΏΡ€ΠΈ использовании Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, являСтся сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ Javascript this относится ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ.

НапримСр:

let myObj = {
  name: 'Miti',
  sayHello() {
    return `${this.name} says hello!`;
  }
};

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, помСняв ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

let yourObj = {
  name: 'Timer'
};

yourObj.sayHello = myObj.sayHello;
// Sets the sayHello method on yourObj to be the sayHello method on yourObj

Если Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ yourObj.sayHello(), ΠΎΠ½ Π²Π΅Ρ€Π½Π΅Ρ‚ 'Timer says hello!'. this Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π·Π²Π°Π½ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ yourObj, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ дСйствия свойств Π²Π½ΡƒΡ‚Ρ€ΠΈ yourObj.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ дСйствия this с функциями со стрСлкой наслСдуСтся ΠΎΡ‚ контСкста. Π’ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… функциях this всСгда относится ΠΊ блиТайшСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² функция со стрСлкой эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ΅Π½Π° ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ var that = this.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ delete ΠΈ in

Π£Π½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ свойству удаляСт Π΅Π³ΠΎ. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ популярно, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:

let anObject = {left: 1, right: 2};
console.log(anObject.left);
// β†’ 1

delete anObject.left;
console.log(anObject.left);
// β†’ undefined

console.log("left" in anObject);
// β†’ false

console.log("right" in anObject);
// β†’ true

Π£Π½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ in сообщаСт Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ свойство.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Object.keys:

let obj = {
  a: 'Santa',
  b: 'Rudolf',
  c: 'Mr. Grinch'
}

console.log(Object.keys(obj));
// -> ["a", "b", "c"]

Object.keys(obj).forEach((key, index) => {
  console.log(key, obj[key]);
})

Ѐункция Object.assign ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ всС свойства ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠΊΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

let objectA = {a: 1, b: 2};
Object.assign(objectA, {b: 3, c: 4});

console.log(objectA);
// -> {a: 1, b: 3, c: 4}

Новый синтаксис ES8 Новая функция Object.values позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ значСния свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

let obj = {
  a: 'Santa',
  b: 'Rudolf',
  c: 'Mr. Grinch'
}

Object.values(obj).forEach(value => {
  console.log(value);
})

// ->
// Santa 
// Rudolf 
// Mr. Grinch 

C ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Object.entries ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массивы, состоящих ΠΈΠ· ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойств ΠΎΠ±ΡŠΠΊΡ‚Π°:

let obj = {
  a: 'Santa',
  b: 'Rudolf',
  c: 'Mr. Grinch'
}

Object.entries(obj).forEach(value => {
  console.log(value);
})

// ->
// ["a", "Santa"]
// ["b", "Rudolf"]
// ["c", "Mr. Grinch"]

Getters ΠΈ Setters

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ getter ΠΈ setter ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ свойства Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. БущСствуСт нСсколько прСимущСств использования этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для получСния ΠΈ установки свойств Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ:

  • МоТно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ Π»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎ установки свойства.
  • МоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствиС Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²ΠΎ врСмя получСния ΠΈΠ»ΠΈ установки свойства.
  • МоТно ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ свойства ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹.

Setters НапримСр:

let restaurant = {
  name: 'Italian Bistro',
  seatingCapacity: 120,
  hasDineInSpecial: true,
  entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine Pesto']
}

ΠšΠ»ΡŽΡ‡ seatingCapacity содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 120. Если ΠΎΠ½ измСнится, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π³ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ. НапримСр, ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΏΠΎΠ»Π΅ seatingCapacity числом, Ρ€Π°Π²Π½Ρ‹ΠΌ 150, Π° Π½Π΅ строкой 'one hundred fifty``'. МоТно Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ setter ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

let restaurant = {
  _name: 'Italian Bistro',
  _seatingCapacity: 120,
  _hasDineInSpecial: true,
  _entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto'],

  set seatingCapacity(newCapacity) {
    if (typeof newCapacity === 'number') {
      this._seatingCapacity = newCapacity;
      console.log(`${newCapacity} is valid input.`);
    } else {
      console.log(`Change ${newCapacity} to a number.`)
    }
  }
}

ОписаниС:

  1. НуТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° свойств с символами подчСркивания. _ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΎ названия свойства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. РСкомСндуСтся Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ подчСркивания для всСх свойств ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ setters для всСх Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΏΠΎΠ·ΠΆΠ΅ Π² своСм ΠΊΠΎΠ΄Π΅.
  2. ΠœΠ΅Ρ‚ΠΎΠ΄ setter set seatingCapacity() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ newCapacity ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ newCapacity содСрТит Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ хранится Π² _seatingCapacity.
  3. Π’Π½ΡƒΡ‚Ρ€ΠΈ setter .seatingCapacity() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (conditional statement), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная newCapacity с Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ - это число.
  4. Если пСрСмСнная число (ΠΏΡ€Π°Π²Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ this._seatingCapacity для измСнСния значСния, присвоСнного _seatingCapacity.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ setter Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ свойства:

// Sets the _seatingCapacity value to 150
restaurant.seatingCapacity = 150;
// -> 150 is valid input.

Getters Getters ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для получСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ свойств Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

let restaurant = {
  _name: 'Italian Bistro',
  _seatingCapacity: 120,
  _hasDineInSpecial: true,
  _entrees: ['Penne alla Bolognese', 'Chicken Cacciatore', 'Linguine pesto'],

  // setters ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  set seatingCapacity(newCapacity) {
    if (typeof newCapacity === 'number') {
      this._seatingCapacity = newCapacity;
    } else {
      console.log(`Change ${newCapacity} to a number.`)
    }
  },

  // getters слуТат для Π²Ρ‹Π²ΠΎΠ΄Π° значСния Π² ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅
  get seatingCapacity() {
    console.log(`There are ${this._seatingCapacity} seats at Italian Bistro.`);
    return this._seatingCapacity;
  }
}

ΠœΠ΅Ρ‚ΠΎΠ΄ getter вызываСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ свойство Π±Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

restaurant.seatingCapacity = 150;
const seats = restaurant.seatingCapacity;

ΠšΠ»Π°ΡΡΡ‹

ΠšΠ»Π°ΡΡΡ‹ (classes) - это инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для быстрого создания ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΠΈ врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Constructor

Бинтаксис классов ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² схоТ, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ - конструктор (constructor). JavaScript Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ constructor() ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° создаСтся Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (instance) класса с использованиСм new:

class Dog {
  constructor(name) {
    this.name = name;
    this.behavior = 0;
  }
}

ОписаниС:

  • Dog это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ класса.
  • JavaScript Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ (invoke) ΠΌΠ΅Ρ‚ΠΎΠ΄ constructor() ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° создаСтся Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Dog.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ constructor() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, name.
  • Π’Π½ΡƒΡ‚Ρ€ΠΈ constructor() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ дСскриптор this. Π’ контСкстС класса, this относится ΠΊ экзСмпляру ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса.
  • ПослС this.name, создаСтся свойтво behavior, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° собака ΠΏΠ»ΠΎΡ…ΠΎ сСбя Π²Π΅Π΄Π΅Ρ‚. Бвойство behavior всСгда инициализируСтся Π½ΡƒΠ»Π΅ΠΌ.

Instance

ЭкзСмпляр (instance) это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит названия свойств ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса, Π½ΠΎ с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями свойств, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class Dog {
  constructor(name) {
    this.name = name;
    this.behavior = 0;
  } 
}

const halley = new Dog('Halley'); // создаСт Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр Dog

console.log(halley.name); // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ, сохранСнноС Π² halley
// -> "Halley"

console.log(halley instanceof Dog); // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ являСтся Π»ΠΈ halley прСдставитСлСм класса Dog
// -> true

ОписаниС:

  • Новая пСрСмСнная halley Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ экзСмпляр класса Dog.
  • ПослС класса Dog, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ дСскриптор new Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр класса Dog. new Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ constructor(), запускаСт ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр.
  • Π‘Ρ‚Ρ€ΠΎΠΊΠ° 'Halley' пСрСдаСся Π² конструктор Dog, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт имя 'Halley' для свойства name.
  • И Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сохранСнноС Π² ΠΊΠ»ΡŽΡ‡Π΅ name Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ halley Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 'Halley' Π² консоль.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹

Бинтаксис классов ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², setters ΠΈ getters Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ нСльзя Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ запятыС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ:

class Dog {
  constructor(name) {
    this._name = name;
    this._behavior = 0;
  }

  get name() {
    return this._name;
  }

  get behavior() {
    return this._behavior;
  }

  incrementBehavior() {
    this._behavior++;
  }
}

Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° свойств ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² - Π½ΡƒΠΆΠ½ΠΎ послС экзСмпляра Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π·Π°Ρ‚Π΅ΠΌ имя свойства ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚Π°ΠΊ ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ созданы Π΄Π²Π° экзСмпляра, nikko and bradford:

let nikko = new Dog('Nikko'); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собаку Nikko

nikko.incrementBehavior(); // Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 1 ΠΊ повСдСнию экзСпляра nikko

let bradford = new Dog('Bradford'); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собаку Bradford

console.log(nikko.behavior); // -> 1
console.log(bradford.behavior); // -> 0

НаслСдованиС

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° сдСлан Π½ΠΎΠ²Ρ‹ΠΉ класс Cat. Он раздСляСт ΠΏΠ°Ρ€Ρƒ свойств (_name ΠΈ _behavior) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ .incrementBehavior() с классом Dog. Π’Π°ΠΊ ΠΆΠ΅ Ρƒ класса Cat Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ свойство _usesLitter, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ кошка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой ящик для мусора 🐱:

class Cat {
  constructor(name, usesLitter) {
    this._name = name;
    this._usesLitter = usesLitter;
    this._behavior = 0;
  }

  get name() {
    return this._name;
  }

  get usesLitter() {
    return this._usesLitter;
  }

  get behavior() {
    return this._behavior;
  }

  incrementBehavior() {
    this._behavior++;
  }
}

Когда нСсколько классов дСлят свойства ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠ½ΠΈ становятся ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°ΠΌΠΈ наслСдования (inheritance) - инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ.

Π‘ наслСдованиСм ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ (parent) класс, Ρ‚Π°ΠΊΠΆΠ΅ извСстный ΠΊΠ°ΠΊ супСр класс (superclass), со свойствами ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ нСсколько Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… (child) классов, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… подклассами (subclasses). Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ классы Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ· своСго Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса.

class Animal {
  constructor(name) {
    this._name = name;
    this._behavior = 0;
  }

  get name() {
    return this._name;
  }

  get behavior() {
    return this._behavior;
  }   

  incrementBehavior() {
    this._behavior++;
  }
  
  hello() {
    return 'Hello, I am ' + this._name + '.'
  }
}

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±Ρ‰ΠΈΠ΅ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС Animal, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° подкласс Cat:

class Cat extends Animal {
  constructor(name, usesLitter) {
    super(name);
    this._usesLitter = usesLitter;
  }
}

ОписаниС:

  • ДСскриптор extends Π΄Π΅Π»Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Animal доступными Π² классС cat.
  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ вызываСтся, ΠΊΠΎΠ³Π΄Π° создаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Cat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° - name ΠΈ usesLitter.
  • ДСскриптор super Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструктор Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса. Π’ этом случаС, super(name) ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π½ΠΈ класса Cat Π² конструктор класса Animal. Когда выполняСтся конструктор Animal, ΠΎΠ½ устанавливаСт this._name = name; для Π½ΠΎΠ²Ρ‹Ρ… экзСпляров Cat.
  • Бвойство _usesLitter ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ для класса Cat, ΠΈ устанавливаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для конструктора Cat.

πŸ“ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: super вызываСтся Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС constructor(), Π° Π·Π°Ρ‚Π΅ΠΌ устанавливаСтся свойство usesLitter Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ строкС. Π’ constructor() всСгда Π½Π°Π΄ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ super, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ this - ΠΈΠ½Π°Ρ‡Π΅ JavaScript выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ (reference error).

НиТС создан Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр Cat ΠΈ Π²Ρ‹Π·Π²Π°Π½ΠΎ Π΅Π³ΠΎ имя, Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ для класса Dog:

const bryceCat = new Cat('Bryce', false);

console.log(bryceCat._name); // -> Bryce

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ класс Cat ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ Animal getters ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ .incrementBehavior().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ наслСдования:

bryceCat.incrementBehavior();
console.log(bryceCat.behavior); // -> 1

ОписаниС:

  • Класс Cat наслСдуСт свойство _behavior, getter behavior, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ .incrementBehavior() класса Animal.
  • Когда Π±Ρ‹Π» создан экзСмпляр bryceCat, конструктор Animal установил Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 свойству _behavior.
  • ΠŸΠ΅Ρ€Π²Π°Ρ строчка Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ наслСдуСмый ΠΌΠ΅Ρ‚ΠΎΠ΄ .incrementBehavior(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ свойство _behavior Π² bryceCat Π½Π° 1.
  • На Π²Ρ‚ΠΎΡ€ΠΎΠΉ строчкС вызываСтся getter behavior.

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ унаслСдованным функциям Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ классы ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ свои собствСнныС свойства, getters, setters ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

НиТС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ getter usesLitter. Бинтаксис создания getters, setters ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ классС:

class Cat extends Animal {
  constructor(name, usesLitter) {
    super(name);
    this._usesLitter = usesLitter;
  }

  get usesLitter() {
    return this._usesLitter;
  }
  
  hello() {
    return super.hello() + ' I am a cat.'
  }
}

Добавился getter usesLitter Π² классС Cat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, сохранСнноС Π² _usesLitter.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ подкласс Dog:

class Dog extends Animal {
  constructor(name) {
    super(name);
  }
}

Π”Π°Π½Π½Ρ‹ΠΉ класс Dog ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ свойства, getters, setters, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ класс Dog, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» сдСлан Π±Π΅Π· наслСдования, ΠΈ Π½Π° Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡŒ мСньшС.

БтатичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Иногда Π½ΡƒΠΆΠ½Ρ‹ классы, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ доступны Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… экзСмплярах ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ прямо ΠΈΠ· класса.

НапримСр класс Date β€” ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр Date Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π΄Π°Ρ‚Ρƒ, ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ статичСский (static) ΠΌΠ΅Ρ‚ΠΎΠ΄, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Date.now(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ прямо ΠΈΠ· класса. ΠœΠ΅Ρ‚ΠΎΠ΄ .now() статичСский, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ прямо ΠΈΠ· класса, Π½ΠΎ Π½Π΅ ΠΈΠ· Π΅Π³ΠΎ экзСмпляра.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ дСскриптор static, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ generateName Π² классС Animal, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ случайноС имя ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅:

class Animal {
  constructor(name) {
    this._name = name;
    this._behavior = 0;
  }

  static generateName() {
    const names = ['Angel', 'Spike', 'Buffy', 'Willow', 'Tara'];
    const randomNumber = Math.floor(Math.random()*5);
    return names[randomNumber];
  }
}

Из-Π·Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова static, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ .generateName() Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ классу Animal ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

console.log(Animal.generateName()); // returns a name

НСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ .generateName() ΠΈΠ· экзСпляра класса Animal ΠΈΠ»ΠΈ экзСпляров Π΅Π³ΠΎ подклассов:

const tyson = new Animal('Tyson'); 
tyson.generateName(); // TypeError

DOM

На самом Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Π²Π΅Π±-сайт состоит ΠΈΠ· HTML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для просмотра Π²Π΅Π±-сайта, прСдставляСт собой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ HTML ΠΈ CSS ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ стили, содСрТимоС ΠΈ структуру Π½Π° страницС, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅.

Помимо синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° (parsing) стилСй ΠΈ структуры HTML ΠΈ CSS, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ создаСт прСдставлСниС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, извСстного ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ модСль Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° (Document Object Model). Π­Ρ‚Π° модСль прСдоставляСт JavaScript доступ ΠΊ тСкстовому содСрТимому ΠΈ элСмСнтам Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π²Π΅Π±-сайта Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ **document** ΠžΠ±ΡŠΠ΅ΠΊΡ‚ document это встроСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ свойств (properties) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (methods), ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ для измСнСния сайтов.

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ DOM ΠΈ HTML-ΠΊΠΎΠ΄ΠΎΠΌ Π•ΡΡ‚ΡŒ нСсколько Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ созданной Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ DOM ΠΈ исходным ΠΊΠΎΠ΄ΠΎΠΌ HTML:

  • DOM измСняСтся Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° JavaScript
  • Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ автоматичСски исправляСт ошибки Π² исходном ΠΊΠΎΠ΄Π΅

ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΡ DOM

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ элСмСнтов DOM структурирован ΠΊΠ°ΠΊ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΡƒΠ·Π»Π°ΠΌΠΈ (nodes), ΠΈ ΡƒΠ·Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ тСкстом, коммСнтариями ΠΈΠ»ΠΈ элСмСнтами.

БСрСтБинтаксис ΡΠ΅Π»Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ²ΠœΠ΅Ρ‚ΠΎΠ΄
ID#demogetElementById()
Class.demogetElementsByClassName()
TagdemogetElementsByTagName()
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ элСмСнтquerySelector()
ВсС элСмСнтыquerySelectorAll()