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

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

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

  • использование объектного литерала,
  • использование ключевого слова new.

Новый объект создается с помощью оператора 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();

В 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( ).

📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!