рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рдпрд╛ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЦреБрдж рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛)

рд╕рд░рд▓ рднрд╛рд╖рд╛ рдореЗрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рднреАрддрд░ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддрдВрддреНрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдк рд╣рд░ рджрд┐рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рддрд░рд╣ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЗрд╕рдХреА рдкреНрд░рдХреГрддрд┐ рд╕реЗ, рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд▓рдЪреАрд▓реЗ рдХреЛрдб рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


/** *   save-    */ const comment = { authorId: 1, comment: '' }; for (let name in comment) { const pascalCasedName = name.slice(0, 1).toUpperCase() + name.slice(1); comment[`save${pascalCasedName}`] = function() { //   } } comment.saveAuthorId(); //  authorId comment.saveComment(); //  comment 

рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╛ рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PHP рднреА рдПрдХ рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЙрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


 <?php class Comment { public $authorId; public $comment; public function __construct($authorId, $comment) { $this->authorId = $authorId; $this->comment = $comment; } //       public function __call($methodName, $arguments) { foreach (get_object_vars($this) as $fieldName => $fieldValue) { $saveMethodName = "save" . strtoupper($fieldName[0]) . substr($fieldName, 1); if ($methodName == $saveMethodName) { //   } } } } $comment = new Comment(1, ''); $comment->saveAuthorId(); //  authorId $comment->saveComment(); //  comment 

рд▓рдЪреАрд▓реА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧрддрд┐рд╢реАрд▓ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рднреА рд╣реИ: Object.create, Object.defineProperty, Function.apply рдФрд░ рдХрдИ рдЕрдиреНрдпред


рдЙрди рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


  1. рдХреЛрдб рдЬрдирд░реЗрд╢рди
  2. рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
  3. рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
  4. рдПрдкреАрдЖрдИ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ
  5. рдЪрд┐рд╣реНрди (рдкреНрд░рддреАрдХ)
  6. рдПрдХ рдкреНрд░реЙрдХреНрд╕реА (рдкреНрд░реЙрдХреНрд╕реА)
  7. рдирд┐рд╖реНрдХрд░реНрд╖

1. рдХреЛрдб рдЬрдирд░реЗрд╢рди


рдХреЛрдб рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдХрд░рдг, рдПрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЙрддреНрддреАрд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 eval('alert("Hello, world")'); 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, eval рдХреА рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ:


  • рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб рд╕рдЦреНрдд рдореЛрдб ('рдЙрдкрдпреЛрдЧ рд╕рдЦреНрдд') рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ eval рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдЗрд╕реА рд╕рдордп, рдИрд╡реИрд▓ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдХреЛрдб рд╣рдореЗрд╢рд╛ рдмрд╛рд╣рд░реА рдЪрд░ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
  • eval рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн (рдпрджрд┐ window.eval рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрджрд┐ рдмрд╕ eval, рдмрд┐рдирд╛ рдЦрд┐рдбрд╝рдХреА рдХреЗ)ред
  • рдЬреЗрдПрд╕ рдорд┐рдирд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрдм рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд╛рдореЛрдВ рдХреЛ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдорд┐рдирд┐рдлрд╛рдЗрдЬрд╝рд░ рдХреЛ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рд╣рдо рдкреБрд░рд╛рдиреЗ рдЕрдЬреНрдЮрд╛рдд рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕реВрдХреНрд╖реНрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдирдпрд╛ рдХрд╛рд░реНрдп ред


 const hello = new Function('name', 'alert("Hello, " + name)'); hello('') // alert("Hello, "); 

Eval рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ ( Function.apply рдпрд╛ Function.call рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд░реНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдореЗрдВ, eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрд╣реБрдд рдХрдо рддрдВрддреНрд░ рдереЗ рдФрд░ рдЗрд╕реЗ рдмрд┐рдирд╛ рдирд┐рд╖реНрдХрд╛рд╕рди рдХреЗ рдЕрд╕рдВрднрд╡ рдерд╛ред рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛ рдорд╛рдирдХ рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджрд┐рдЦрд╛рдИ рджреА рд╣реИ рдФрд░ eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдм рдмрд╣реБрдд рдХрдо рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


2. рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рджреЛрдиреЛрдВ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:


  • Function.length - рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


     const func = function(name, surname) { console.log(`Hello, ${surname} ${name}`) }; console.log(func.length) // 2 

  • Function.apply рдФрд░ Function.call - рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:


     const person = { name: '', introduce: function() { return ` ${this.name}`; } } person.introduce(); //   person.introduce.call({ name: '' }); //   

    рд╡реЗ рдХреЗрд╡рд▓ рдЙрд╕ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдореЗрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди.call рдореЗрдВ, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг Math.max рдлрд╝рдВрдХреНрд╢рди рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ):


     Math.max.apply(null, [1, 2, 4, 3]); // 4 

    рдирдП рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде , рдЖрдк рдмрд╕ рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


     Math.max(...[1, 2, 4, 3]); // 4 

  • рдлрд╝рдВрдХреНрд╢рди.рдмрд┐рдВрдж - рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдХрд┐рд╕реА рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде:


     const person = { name: '', introduce: function() { return ` ${this.name}`; } } person.introduce(); //   const introduceEgor = person.introduce.bind({ name: '' }); introduceEgor(); //   

  • Function.caller - рдЖрдкрдХреЛ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдорд╛рдирдХ рдореЗрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ рдФрд░ рд╕рдЦреНрдд рдореЛрдб рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдерд╛ рдХрд┐ рдпрджрд┐ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЯреЗрд▓ рдХреЙрд▓ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлрдВрдХреНрд╢рди.caller рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:


     const a = function() { console.log(a.caller == b); } const b = function() { a(); } b(); // true 

  • Function.toString - рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд╛рдордЧреНрд░реА рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:


     const getFullName = (name, surname, middlename) => { console.log(`${surname} ${name} ${middlename}`); } getFullName.toString() /* * "(name, surname, middlename) => { * console.log(`${surname} ${name} ${middlename}`); * }" */ 

    рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:




рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:


рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 /** *    . * @param fn  */ const getFunctionParams = fn => { const COMMENTS = /(\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s*=[^,\)]*(('(?:\\'|[^'\r\n])*')|("(?:\\"|[^"\r\n])*"))|(\s*=[^,\)]*))/gm; const DEFAULT_PARAMS = /=[^,]+/gm; const FAT_ARROW = /=>.*$/gm; const ARGUMENT_NAMES = /([^\s,]+)/g; const formattedFn = fn .toString() .replace(COMMENTS, "") .replace(FAT_ARROW, "") .replace(DEFAULT_PARAMS, ""); const params = formattedFn .slice(formattedFn.indexOf("(") + 1, formattedFn.indexOf(")")) .match(ARGUMENT_NAMES); return params || []; }; const getFullName = (name, surname, middlename) => { console.log(surname + ' ' + name + ' ' + middlename); }; console.log(getFunctionParams(getFullName)); // ["name", "surname", "middlename"] 


рд╢рд░реАрд░ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рдирд╛
 /** *     . * @param fn  */ const getFunctionBody = fn => { const restoreIndent = body => { const lines = body.split("\n"); const bodyLine = lines.find(line => line.trim() !== ""); let indent = typeof bodyLine !== "undefined" ? (/[ \t]*/.exec(bodyLine) || [])[0] : ""; indent = indent || ""; return lines.map(line => line.replace(indent, "")).join("\n"); }; const fnStr = fn.toString(); const rawBody = fnStr.substring( fnStr.indexOf("{") + 1, fnStr.lastIndexOf("}") ); const indentedBody = restoreIndent(rawBody); const trimmedBody = indentedBody.replace(/^\s+|\s+$/g, ""); return trimmedBody; }; //       getFullName const getFullName = (name, surname, middlename) => { console.log(surname + ' ' + name + ' ' + middlename); }; console.log(getFunctionBody(getFullName)); 


рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдорд┐рдирд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рджреЛрдиреЛрдВ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рд╡рд░реНрддрдиред


3. рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред


рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдг


  • Object.assign - рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


     Object.assign({}, { a: 1 }, { b: 2 }, { c: 3 }) // {a: 1, b: 2, c: 3} 

  • Object.keys рдФрд░ Object.values - рдпрд╛ рддреЛ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ:


     const obj = { a: 1, b: 2, c: 3 }; console.log(Object.keys(obj)); // ["a", "b", "c"] console.log(Object.values(obj)); // [1, 2, 3] 

  • Object.entries - рдкреНрд░рд╛рд░реВрдк [[key1, value1], [key2, value2]] рдореЗрдВ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ:


     const obj = { a: 1, b: 2, c: 3 }; console.log(Object.entries(obj)); // [["a", 1], ["b", 2], ["c", 3]] 

  • Object.prototype.hasOwnProperty - рдпрджрд┐ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ (рдЗрд╕рдХреА рд╡рд┐рд░реЛрдз рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд╣реАрдВ):


     const obj = { a: 1 }; obj.__proto__ = { b: 2 }; console.log(obj.hasOwnProperty('a')); // true console.log(obj.hasOwnProperty('b')) // false 

  • Object.getOwnPropertyNames - рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдФрд░ рдиреЙрди- рдПрдиреНрдпреБрдореЗрдЯреЗрдб рджреЛрдиреЛрдВ рд╕рд╣рд┐рдд, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ:


     const obj = { a: 1, b: 2 }; Object.defineProperty(obj, 'c', { value: 3, enumerable: false }); //    for (let key in obj) { console.log(key); } // "a", "b" console.log(Object.getOwnPropertyNames(obj)); // [ "a", "b", "c" ] 

  • Object.getOwnPropertySymbols - рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд╣реАрдВ) рд╡рд░реНрдг:


     const obj = {}; const a = Symbol('a'); obj[a] = 1; console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(a) ] 

  • Object.prototyp.propertyIsEnumerable - рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдп рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди-рд▓реВрдк рдХреЗ рд▓рд┐рдП, рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ):


     const arr = [ ' ' ]; console.log(arr.propertyIsEnumerable(0)); // true тАФ  ' '   console.log(arr.propertyIsEnumerable('length')); // false тАФ  length    


рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕


рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░реНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЧреЗрдЯрд░реНрд╕ рдПрдВрдб рд╕реЗрдЯрд░реНрд╕ - рдЧреЗрдЯ / рд╕реЗрдЯ), рдЧреБрдгреЛрдВ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдпрд╛ рдЧреИрд░-рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред


  • Object.defineProperty рдФрд░ Object.defineProperties - рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд╡рд░рдгрдХ рдмрдирд╛рддрд╛ рд╣реИред рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рдПрдВ:


     const obj = { name: '', surname: '' }; Object.defineProperty(obj, 'fullname', { //     fullname get: function() { return `${this.name} ${this.surname}`; }, //     fullname (     delete obj.fullname) set: function(value) { const [name, surname] = value.split(' '); this.name = name; this.surname = surname; }, }); console.log(obj.fullname); //   obj.fullname = ' '; console.log(obj.name); //  console.log(obj.surname); //  

    рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлреБрд▓рдирд╛рдо рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЕрдкрдирд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд╛рдо рдФрд░ рдЙрдкрдирд╛рдо рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рдЧреЗрдЯрдЯрд░ рдФрд░ рдПрдХ рд╕реЗрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ - рд╣рдо рдХреЗрд╡рд▓ рдЧреЗрдЯреНрдЯрд░ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рд╣рдо рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕реЗрдЯрд░ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рдВрдЧред
    рдкреНрд░рд╛рдкреНрдд / рд╕реЗрдЯ рдЧреБрдгреЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдкрд╛рд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдФрд░ рдЧреБрдг рд╣реИрдВ:


     const obj = {}; //      get/set,       value.    get/set  value.   тАФ undefined. Object.defineProperty(obj, 'name', { value: '' }); // ,         (for-in, for-of, Object.keys).   тАФ false. Object.defineProperty(obj, 'a', { enumerable: true }); //         defineProperty     delete.   тАФ false. Object.defineProperty(obj, 'b', { configurable: false }); //      .   тАФ false. Object.defineProperty(obj, 'c', { writable: true }); 

  • Object.getOwnPropertyDescriptor рдФрд░ Object.getOwnPropertyDescriptors - рдЖрдкрдХреЛ рдЗрдЪреНрдЫрд┐рдд рд╡рд╕реНрддреБ рд╡рд┐рд╡рд░рдгрдХ рдпрд╛ рдЙрдирдХреА рдкреВрд░реА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:


     const obj = { a: 1, b: 2 }; console.log(Object.getOwnPropertyDescriptor(obj, "a")); // { configurable: true, enumerable: true, value: 1, writable: true } /** * { * a: { configurable: true, enumerable: true, value: 1, writable: true }, * b: { configurable: true, enumerable: true, value: 2, writable: true } * } */ console.log(Object.getOwnPropertyDescriptors(obj)); 


рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдкреНрд░рддрд┐рдмрдВрдз рдмрдирд╛рдирд╛


  • рдСрдмреНрдЬреЗрдХреНрдЯ.рдлрд╝реНрд░реАрдЬрд╝ - рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ "рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ"ред рдЗрд╕ рддрд░рд╣ рдХреЗ "рдлреНрд░реАрдЬ" рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдкреВрд░реНрдг рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рд╛ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирдП рдЬреЛрдбрд╝реЗ рдЧрдП, рд╡рд┐рд╡рд░рдг рдмрджрд▓реЗ рдЧрдП:


     const obj = Object.freeze({ a: 1 }); //       ,       . obj.a = 2; obj.b = 3; console.log(obj); // { a: 1 } console.log(Object.isFrozen(obj)) // true 

  • Object.seal - рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдг "рд╕реАрд▓"ред рд╕реАрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ.рдлреНрд░реАрдЬ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрдИ рдЕрдВрддрд░ рд╣реИрдВред рд╣рдо, Object.freeze рдХреЗ рд░реВрдк рдореЗрдВ, рдирдП рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ, рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:


     const obj = Object.seal({ a: 1 }); obj.a = 2; //  a   2 //     ,       . obj.b = 3; console.log(obj); // { a: 2 } console.log(Object.isSealed(obj)) // true 

  • Object.preventExtensions - рдирдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ / рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддрд╛ рд╣реИ:


     const obj = Object.preventExtensions({ a: 1 }); obj.a = 2; //       ,       . obj.b = 3; console.log(obj); // { a: 2 } console.log(Object.isExtensible(obj)) // false 


рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк


  • Object.create - рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ "рдЧреБрдг" рд╕реЗ рдЧреБрдг рдХреЗ рдмрд┐рдирд╛, "рд╕реНрд╡рдЪреНрдЫ" рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


     const pureObj = Object.create(null); 

  • Object.getPrototypOf рдФрд░ Object.setPrototypOf - рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдкреНрд░рд╛рдкреНрдд / рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


     const duck = {}; const bird = {}; Object.setPrototypeOf(duck, bird); console.log(Object.getPrototypeOf(duck) === bird); // true console.log(duck.__proto__ === bird); // true 

  • Object.prototype.isPrototypeOf - рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ, рддреЛ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:


     const duck = {}; const bird = {}; duck.__proto__ = bird; console.log(bird.isPrototypeOf(duck)); // true 


4. рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рдПрдкреАрдЖрдИ


рдИрдПрд╕ 6 рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред


рдЙрдирдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдзрд┐рдпрд╛рдБ рдРрд╕реА рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдореМрдЬреВрджрд╛ рддрд░реАрдХреЛрдВ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдирд╛рдорд╕реНрдерд╛рди рдкрд░ред


рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рди рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреА рдЦреЛрдЬ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реБрдИ рдФрд░ рдЕрдзрд┐рдХ рд╢рдмреНрджрд╛рд░реНрде рджрд┐рдП рдЧрдП, рдмрд▓реНрдХрд┐ рдЕрдкреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рднреА рдмрдЪрд╛ рдЬрдм рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 let obj = Object.create(null); obj.qwerty = 'qwerty'; console.log(obj.__proto__) // null console.log(obj.hasOwnProperty('qwerty')) // Uncaught TypeError: obj.hasOwnProperty is not a function console.log(obj.hasOwnProperty === undefined); // true console.log(Object.prototype.hasOwnProperty.call(obj, 'qwerty')); // true 

рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдиреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдиреАрд░рд╕ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд╣рд▓реЗ, рдЬрдм рдПрдХ рдЧрд▓рдд рдорд╛рди (рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдкрд░ Object.defineProperty рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, Object.getOwnPropertyDescriptor рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЪреБрдкрдЪрд╛рдк рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд▓реМрдЯрд╛, рдлрд┐рд░ рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рд╕реЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рдбреЗрдЯрд╛ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред ред


рдХрдИ рдирдП рддрд░реАрдХреЗ рднреА рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ:


  • Reflect.construct Object.create рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рддреБрд░рдВрдд рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ:


     function Person(name, surname) { this.name = this.formatParam(name); this.surname = this.formatParam(surname); } Person.prototype.formatParam = function(param) { return param.slice(0, 1).toUpperCase() + param.slice(1).toLowerCase(); } const oldPerson = Object.create(Person.prototype); // {} Person.call(oldPerson, '', ''); // {name: "", surname: ""} const newPerson = Reflect.construct(Person, ['', '']); // {name: "", surname: ""} 

  • Reflect.ownKeys - рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧреБрдгреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ (рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ):


     let person = { name: '', surname: '' }; person.__proto__ = { age: 30 }; console.log(Reflect.ownKeys(person)); // ["name", "surname"] 

  • Reflect.deleteProperty - рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдП рдЧрдП рдбрд┐рд▓реАрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк:


     let person = { name: '', surname: '' }; delete person.name; // person = {surname: ""} Reflect.deleteProperty(person, 'surname'); // person = {} 

  • Reflect.has - рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк, рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


     let person = { name: '', surname: '' }; console.log('name' in person); // true console.log(Reflect.has(person, 'name')); // true 

  • Reflect.get рдФрд░ Reflect.set - рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдг рдкрдврд╝рдиреЗ / рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП:


     let person = { name: '', surname: '' }; console.log(Reflect.get(person, 'name')); //  Reflect.set(person, 'surname', '') // person = {name: "", surname: ""} 


рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ


рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред


рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


  • рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬрдм emitDecoratorMetadata рдзреНрд╡рдЬ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдореБрдЦ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдкреНрд░рдХрд╛рд░:
     const typeData = Reflect.getMetadata("design:type", object, propertyName); 
  • рдЙрд▓рдЯрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд▓реЛрдХрдкреНрд░рд┐рдп InversifyJS рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд▓рд╣рд╛рд▓, рдЗрд╕ рдкреЙрд▓реАрдлрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред


5. рдкреНрд░рддреАрдХ


рдкреНрд░рддреАрдХ рдПрдХ рдирдпрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдкрддреНрддрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рддрд░рд╣ рд╕реЗ рдЪрд░рд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ:


  1. рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддреАрдХреЛрдВ - рдкреНрд░рддреАрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд╛рда рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


     const sym1 = Symbol('name'); const sym2 = Symbol('name'); console.log(sym1 == sym2); // false 

  2. рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд░реНрдг - рд╡рд░реНрдг рд╡реИрд╢реНрд╡рд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рди рдХреБрдВрдЬреА рд╡рд╛рд▓реЗ рд╡рд░реНрдг рд╕рдорд╛рди рд╣реИрдВ:


     const sym3 = Symbol.for('name'); const sym4 = Symbol.for('name'); const sym5 = Symbol.for('other name'); console.log(sym3 == sym4); // true,        'name' console.log(sym3 == sym5); // false,     


рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣рдореЗрдВ рдбрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдореЗрдВ рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЧреБрдгрд╡рддреНрддрд╛ рдорд╛рдирдХ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рди рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ) рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдирдП рдорд╛рдирдХ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрдИ рдорд╛рдирдХ рдкреНрд░рддреАрдХ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рдирдП рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:


  • Symbol.iterator - рдЖрдк рдХреЗ рд▓рд┐рдП рдпрд╛ ... рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдирд┐рдпрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


     let arr = [1, 2, 3]; //       arr[Symbol.iterator] = function() { const self = this; let pos = this.length - 1; return { next() { if (pos >= 0) { return { done: false, value: self[pos--] }; } else { return { done: true }; } } } }; console.log([...arr]); // [3, 2, 1] 

  • Symbol.hasInstance рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред Instof рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


     class MyArray { static [Symbol.hasInstance](instance) { return Array.isArray(instance); } } console.log([] instanceof MyArray); // true 

  • Symbol.isConcatSpreadable - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА Aratt.concat рдореЗрдВ рд╕рдорд╛рдкреНтАНрдд рд╣реЛрдиреЗ рдкрд░ рд╕рдорддрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ:


     let firstArr = [1, 2, 3]; let secondArr = [4, 5, 6]; firstArr.concat(secondArr); // [1, 2, 3, 4, 5, 6] secondArr[Symbol.isConcatSpreadable] = false; console.log(firstArr.concat(secondArr)); // [1, 2, 3, [4, 5, 6]] 

  • Symbol.species - рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдРрд░реЗ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ .map рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рдирдП рд╕рд░рдгреА рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, Array рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЕрд╡рд░реЛрдзрдХ [Symbol.species] рдЬреИрд╕реЗ:


     Array.prototype.map = function(cb) { const ArrayClass = this.constructor[Symbol.species]; const result = new ArrayClass(this.length); this.forEach((value, index, arr) => { result[index] = cb(value, index, arr); }); return result; } 

    рдЗрд╕ рдкреНрд░рдХрд╛рд░, Symbol.species рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдХрдХреНрд╖рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдорд╛рдирдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреИрд╕реЗ рдХрд┐ .map, .reduce, рдЖрджрд┐ рдРрд░реЗ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:


     class MyArray extends Array { static get [Symbol.species]() { return this; } } const arr = new MyArray(1, 2, 3); // [1, 2, 3] console.log(arr instanceof MyArray); // true console.log(arr instanceof Array); // true //   Array.map     Array,    Symbol.species  this      MyArray const doubledArr = arr.map(x => x * 2); console.log(doubledArr instanceof MyArray); // true console.log(doubledArr instanceof Array); // true 

    рдмреЗрд╢рдХ, рдпрд╣ рди рдХреЗрд╡рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдорд╛рдирдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдмрд╕ рдЙрд╕реА рд╡рд░реНрдЧ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд╡рд░реЛрдзрдХ [Symbol.species]ред


  • Symbol.toPrimitive - рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЛ рдЖрджрд┐рдо рдореВрд▓реНрдп рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рдкрд╣рд▓реЗ, рдПрдХ рдЖрджрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЕрдм рд╕рдм рдХреБрдЫ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


     const figure = { id: 1, name: '', [Symbol.toPrimitive](hint) { if (hint === 'string') { return this.name; } else if (hint === 'number') { return this.id; } else { // default return this.name; } } } console.log(`${figure}`); // hint = string console.log(+figure); // hint = number console.log(figure + ''); // hint = default 

  • Symbol.match - рдЖрдкрдХреЛ String.prototyp.match рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


     class StartAndEndsWithMatcher { constructor(value) { this.value = value; } [Symbol.match](str) { const startsWith = str.startsWith(this.value); const endsWith = str.endsWith(this.value); if (startsWith && endsWith) { return [this.value]; } return null; } } const testMatchResult = '||'.match(new StartAndEndsWithMatcher('|')); console.log(testMatchResult); // ["|"] const catMatchResult = '|'.match(new StartAndEndsWithMatcher('|')); console.log(catMatchResult) // null 

    тАФ Symbol.replace , Symbol.search Symbol.split String.prototype .



, ( reflect-metadata ) . - , , . :


 const validationRules = Symbol('validationRules'); const person = { name: '', surname: '' }; person[validationRules] = { name: ['max-length-256', 'required'], surname: ['max-length-256'] }; 

6. (Proxy)


Proxy , Reflect API Symbols ES6, // , , . , .


, data-binding MobX React, Vue . .


:


 const formData = { login: 'User', password: 'pass' }; const proxyFormData = new Proxy(formData, { set(target, name, value) { target[name] = value; this.forceUpdate(); //   React- } }); //       forceUpdate()    React proxyFormData.login = 'User2'; //     ,   -      proxyFormData.age = 20; 

, /:


 const formData = { login: 'User', password: 'pass' }; const proxyFormData = {}; for (let param in formData) { Reflect.defineProperty(proxyFormData, `__private__${param}`, { value: formData[param], enumerable: false, configurable: true }); Reflect.defineProperty(proxyFormData, param, { get: function() { return this[`__private__${param}`]; }, set: function(value) { this[`__private__${param}`] = value; this.forceUpdate(); //   React- }, enumerable: true, configurable: true }); } //       forceUpdate()    React proxyFormData.login = 'User2'; //                  -  Reflect.defineProperty proxyFormData.age = 20; 

-, тАФ Proxy ( , ), / , delete obj[name] .


7.


JavaScript , ECMAScript 4, . , .


You Don't Know JS .

Source: https://habr.com/ru/post/hi417097/


All Articles