07ObjectsFunctionalStyle.md 3.8 KB

ООП в функциональном стиле.

Создание объекта

Для создания объектов используются функции-конструкторы. Они создают новые объекты определенного типа, который совпадает с именем функции:

function Person(){
}

var person = new Person();

По всеобщей договоренности, функции-конструкторы именуются с большой буквы (Person). Для создания нового объекта используется оператор new, который создает пустой объект, заносит в него определенное множество технической информации и передает его как this в конструктор:

function Person(name, surname){
    this.name    = name;
    this.surname = surname;
}

var person = new Person("Ivan", "Petroff");

Обратите внимание, что конструктор ничего не возращает, используя return. Считается что он возвращает новый объект, для этого достаточно просто заполнить нужные поля в this.

Методы.

Так же как данные, мы можем задать определенные методы объекту:

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), для этого используется другой подход - так называемые замыкания.

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