summaryrefslogtreecommitdiff
path: root/content/digarden/20221114142614-ооп_в_javascript.org
blob: da2ceafed72e38e385bea911a4f66909c51e27af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
:PROPERTIES:
:ID:       3df0aee3-71c5-4c3e-8833-85bd9db7093c
:END:
#+title: ООП в Javascript
* ООП в Javascript
** Создание простого блюпринта
*** Constructor function
#+begin_src js
  function Human (firstName, lastName) {
      this.firstName = firstName
      this.lastName = lastName
  }
#+end_src

*** Class
#+begin_src js
  class Human {
      constructor(firstName, lastName) {
	  this.firstName = firstName
	  this.lastName = lastName
      }
  }
#+end_src

*** Objects Linking to Other Objects (OLOO)
#+begin_src js
  const Human = {
      init (firstName, lastName ) {
	  this.firstName = firstName
	  this.lastName = lastName
      }
  }

  const chris = Object.create(Human).init('Chris', 'Coyier')
#+end_src

*** Factory functions
#+begin_src js
  function Human (firstName, lastName) {
      return {
	  firstName,
	  lastName
      }
  }
#+end_src

*** Методы
Методы лучше всего определять в Prototype, так как тогда все инстансы
будут использовать одну функцию, а не иметь непосредственно уникальную
функцию в инстансе (т.е. дублировать функции по сути).

** Наследование
*** Класс
#+begin_src js
  class Child extends Parent {
      // ... Stuff goes here
  }

  class Developer extends Human {
      constructor(firstName, lastName) {
	  super(firstName, lastName)
      }
  }

  const chris = new Developer('Chris', 'Coyier')
#+end_src

*** Прототипы
Остальные методы наследования подразумевают ручное изменение прототипа.

** Модификаторы доступа
*** Public
По дефолту всё Public и как таковых модификаторов доступа в Javascript и нет
*** Private
Не так давно добавили настоящие приватные поля и методы при помощи ~#~
#+begin_src js
  this.#fuel = 50
#+end_src

*** Private by convention
Можно как в питоне приватные вещи помечать подчеркиванием ~_~
#+begin_src js
  this._fuel = 50
#+end_src