Функции-конструкторы и создание объектов 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();
Свойство 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( ).
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах