Функции-конструкторы и создание объектов JS

Объекты являются основными элементами JavaScript. В JavaScript всё является объектом, лишь за двумя исключениями — null и undefined (числовые литералы так же являются объектами). На самом базовом уровне объекты существуют как семейства свойств.

JavaScript предоставляет два основных метода создания объектов:

Новый объект создается с помощью оператора new в паре с конструктором Object.

var myObj = new Object();

Эту запись можно упростить:

var empty = {}; // Объект без свойств
var point = { x:0, y:0 };
var circle = { x:point.x, y:point.y+1, radius:2 };
var homer = {
"name": "Homer Simpson",
"last name": "Devid",
"age": 34,
"married": true,
"email": "homer@example.com"
};

Для обращения к элементам объекта можно использовать оператор точку или propertyNameExpression (выражение JavaScript, которое определяется как строка, формирующая имя свойства, к которому происходит обращение). Например:

homer.name
homer['last name'] или можно даже так homer['las'+'t name']

Двойные кавычки можно применить, если имя свойства содержит недопустимые идентификаторы JavaScript. Если вы попытаетесь прочесть значение несуществующего свойства, вы получите undefined.

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

// конструктор объекта "Автомобиль" 
function Automobile (aVendorName, aModel) {
    this.vendor = aVendorName;
    this.model = aModel;
    this.toString = autoToStr; 
    return this;
}
// функция, выполняющая роль метода объекта "Автомобиль" 
function autoToStr() {
    return this.vendor+" "+this.model; 

В данном примере используется ключевое слово - this. this представляет собой внутренний указатель объекта. Таким образом, запись this.vendor = aVendorName; создает свойство с именем "vendor" в текущем объекте и присваивает ему значение переменной "aVendorName". После создания и инициализации всех свойств объекта, функция должна выполнить команду return this - т.е. вернуть указатель на объект в программу.

Для создания переменных объектных типов данных в JavaScript используется специальный оператор new, который записывается перед конструктором объекта. Таким образом, создание переменной объектного типа "Автомобиль" можно записать следующим образом:

// создание переменной объектного типа данных "Автомобиль" 
var myAuto = new Automobile("Toyota", "Celica");

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

// конструктор объекта "Двигатель" 
function Engine (cil, v) {
    this.cilCount = cil;
    this.v = v;
    return this;
}
// конструктор объекта "Автомобиль" 
function Automobile (aVendorName, aModel, nCil, V) {
    this.vendor = aVendorName;
    this.model = aModel;
    this.engine = new Engine (nCil, V);
    this.getInfo = autoInfo;

    return this;
}
function autoInfo() {
    alert ("Производитель: "+this.vendor+"\n"+
           "Модель: "+this.model+"\n"+
           "Двигатель: "+this.engine.cilCount+"цил. объем "+this.engine.v+"л.\n"); 
}

var myAuto = new Automobile("Toyota", "Celica", 6, 2.2);
myAuto.getInfo();

Свойство prototype

В JavaScript используется уникальная форма создания объектов и наследования, которая называется прототипным наследованием. Суть этого метода (в отличие от классической схемы класс-объект, знакомой большинству программистов) состоит в том, что конструктор объекта может наследовать методы от другого объекта, создавая прототип объекта — prototype, на основе которого строятся все остальные новые объекты.

Весь этот процесс облегчается наличием свойства prototype. Это свойство есть у любой функции, а раз конструктором может стать любая функция, то это свойство есть и у конструктора. Прототипы не наследуют свойства от других прототипов или других конструкторов; они наследуют их от физических объектов.

// Создание конструктора для объекта Person
function Person( name ) {
this.name = name;
}

// Добавление нового метода к объекту Person
Person.prototype.getName = function() {
return this.name;
};

// Создание нового конструктора объекта User
function User( name, password ) {
// Учтите, что здесь не поддерживается постепенная
// перегрузка-наследование, например возможность вызова
// конструктора суперкласса
this.name = name;
this.password = password;
};
// Объект User наследует все методы объекта Person
User.prototype = new Person();
// Для объекта User мы добавляет свой собственный метод
User.prototype.getPassword = function() {
return this.password;
};

Разберем строку строка User.prototype = new Person( );. User — это ссылка на функцию конструктора объекта User. При помощи выражения new Person( ) создается новый объект Person, использующий конструктор Person. Результат его работы присваивается в качестве значения свойству prototype конструктора User. Это означает, что при каждом использовании выражения new User( ), новый объект User будет обладать всеми методами, которые были у объекта Person, на тот момент, когда вы использовали выражение new Person( ).