瀏覽代碼

private in closure

Ivan Grinkin 8 年之前
父節點
當前提交
dd9fb6ac64
共有 1 個文件被更改,包括 66 次插入0 次删除
  1. 66 0
      07ObjectsFunctionalStyle.md

+ 66 - 0
07ObjectsFunctionalStyle.md

@@ -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` в её области видимости.