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