|
@@ -23,3 +23,69 @@ function Person(name, surname){
|
|
|
|
|
|
var person = new Person("Ivan", "Petroff");
|
|
|
```
|
|
|
+
|
|
|
+Обратите внимание, что конструктор ничего не возращает, используя `return`. Считается что он возвращает новый объект, для этого достаточно просто заполнить нужные поля в `this`.
|
|
|
+
|
|
|
+## Методы.
|
|
|
+
|
|
|
+Так же как данные, мы можем задать определенные методы объекту:
|
|
|
+
|
|
|
+```javascript
|
|
|
+function Person(name, surname){
|
|
|
+ this.name = name;
|
|
|
+ this.surname = surname;
|
|
|
+
|
|
|
+ this.getFullName = function(){
|
|
|
+ return this.name + (this.fatherName ? " " + this.fatherName + " " : " ") + this.surname;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+var person = new Person("Ivan", "Petroff");
|
|
|
+alert(person.getFullName());
|
|
|
+
|
|
|
+person.fatherName = "Sydorych"
|
|
|
+alert(person.getFullName());
|
|
|
+```
|
|
|
+
|
|
|
+## Приватные методы и данные
|
|
|
+
|
|
|
+**JS** не предоставляет обычных для Объектно-ориентированных языков программирования возможностей ограничения доступа к полям объекта (`private`, `public`, `protected`), для этого используется
|
|
|
+другой подход - так называемые *замыкания*.
|
|
|
+
|
|
|
+```javascript
|
|
|
+function Person(name, surname){
|
|
|
+
|
|
|
+ this.name = name
|
|
|
+ this.surname = surname
|
|
|
+
|
|
|
+ var originalFullName = name + " " + surname
|
|
|
+
|
|
|
+ this.getFullName = function(){
|
|
|
+ return this.name + (this.fatherName ? " " + this.fatherName + " " : " ") + this.surname
|
|
|
+ }
|
|
|
+
|
|
|
+ this.getOriginalName = function(){
|
|
|
+ return name
|
|
|
+ }
|
|
|
+
|
|
|
+ this.getOriginalSurname = function(){
|
|
|
+ return surname
|
|
|
+ }
|
|
|
+
|
|
|
+ this.getOriginalFullName = function(){
|
|
|
+ return originalFullName
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+var person = new Person("Ivan", "Petroff")
|
|
|
+person.name = "John"
|
|
|
+person.surname = "Doe"
|
|
|
+alert(person.getFullName())
|
|
|
+
|
|
|
+alert(person.getOriginalName())
|
|
|
+alert(person.getOriginalFullName())
|
|
|
+```
|
|
|
+
|
|
|
+Пример выше иллюстрирует этот подход: методы объекта `Person`, например `getOriginalFullName`, имеют доступ к области видимости уже *завершенной* функции. Код же *снаружи*, то есть определенный
|
|
|
+вне конструктора `Person` никак не может получить значения переменных, определенных внутри функции (например `originalFullName`). Обратите внимание, что `this.name` и `name` - это **разные переменные**.
|
|
|
+Одна из них является частью новосозданного объекта, вторая же - параметр функции `Person` в её области видимости.
|