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
|