Поля класса
Состояние объектов класса (а также структур) задается с помощью переменных, которые называются полями (fields). При создании объекта (экземпляра класса) в динамической памяти (куче) выделяется участок памяти, содержащий набор полей, определяемых классом, и в них записываются значения, характеризующие начальное состояние данного экземпляра. Объявление полей выполняется следующим образом:
Например, в классе Person заданы следующие поля:
private string name; // задается значение «» private int age; // задается значение 0 private double salary; // задается значение 0.0
Общим правилом ООП является создание закрытых полей, имеющих режим доступа private. Данный режим задается полям по умолчанию. Таким образом, ограничивается влияние пользователей на состояние объектов. Любое воздействие на состояние объекта класса выполняется с использованием свойств или методов класса, которые контролируют последствия этих воздействий.
Если полям класса не задается значение при объявлении, то они автоматически инициализируются значениями по умолчанию. Для значащих переменных – это нулевое значение, для строк – это пустая строка, а для ссылочных переменных – это стандартное значение null, как показано в комментариях описания класса Person.
Обычные поля класса создаются для каждого создаваемого объекта в выделенном ему участке памяти в куче. Областью видимости полей являются все методы класса. При этом для использования поля требуется задавать только его имя. Например, метод вычисления возраста для объекта класса Person в днях может быть реализован следующим образом:
int days = age * 365; // age – поле данного объекта return days:
В качестве модификатора поля может использоваться ключевое слово static, обозначающее, что это статическое поле. Например, в классе Person может быть описано следующее статическое поле:
static int numPersons=0; // кол-во объектов класса
Статическое поле класса создастся только одно для всего класса. Для обращения к нему нужно указать имя класса и через точку – имя статического поля. Например:
Если поле имеет режим public, то оно доступно там, где имеется ссылка на объект данного класса. Для обращения к этим полям из методов других классов (если поля открытые) нужно использовать ссылочную переменную, которая хранит ссылку на созданный объект. Например:
Person р; //объявление переменной типа Person
р = new Person(); //создание объекта и сохр. ссылки
p.Name = «Иванов П.И.//задание значения public поля
Время существования полей определяется объектом, которому они принадлежат. Объекты в куче, с которыми не связана ни одна ссылочная переменная, становятся недоступными и удаляются сборщиком мусора.
Поле класса
Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.
Ме́тод в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-то классу или объекту.
Конте́йнер в программировании — тип, позволяющий инкапсулировать в себе объекты других типов. Контейнеры, в отличие от коллекций, реализуют конкретную структуру данных.
Конста́нта в программировании — способ адресации данных, изменение которых рассматриваемой программой не предполагается или запрещается.
Примитивный (встроенный, базовый) тип — тип данных, предоставляемый языком программирования как базовая встроенная единица языка.
Каламбур типизации является прямым нарушением типобезопасности. Традиционно возможность построить каламбур типизации связывается со слабой типизацией, но и некоторые сильно типизированные языки или их реализации предоставляют такие возможности (как правило, используя в связанных с ними идентификаторах слова unsafe или unchecked). Сторонники типобезопасности утверждают, что «необходимость» каламбуров типизации является мифом.
Блок (также говорят блок кода, блок команд, блок инструкций) в программировании — это логически сгруппированный набор идущих подряд инструкций в исходном коде программы, является основой парадигмы структурного программирования.
В языках программирования объявле́ние (англ. declaration) включает в себя указание идентификатора, типа, а также других аспектов элементов языка, например, переменных и функций. Объявление используется, чтобы уведомить компилятор о существовании элемента; это весьма важно для многих языков (например, таких как Си), требующих объявления переменных перед их использованием.
Анонимная функция в программировании — особый вид функций, которые объявляются в месте использования и не получают уникального идентификатора для доступа к ним. Поддерживаются во многих языках программирования.
Абстракция данных — популярная и в общем неверно определяемая техника программирования. Фундаментальная идея состоит в разделении несущественных деталей реализации подпрограммы и характеристик, существенных для корректного её использования. Такое разделение может быть выражено через специальный «интерфейс», сосредотачивающий описание всех возможных применений программы.
Объектами первого класса (англ. first-class object, first-class entity, first-class citizen) в контексте конкретного языка программирования называются элементы, которые могут быть переданы как параметр, возвращены из функции, присвоены переменной.
Коллекция в программировании — программный объект, содержащий в себе, тем или иным образом, набор значений одного или различных типов, и позволяющий обращаться к этим значениям.
Пара́метр в программировании — принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр — в каком качестве функция применила это принятое. То есть вызывающий код передает аргумент в параметр, который определен в члене спецификации функции.
При́месь (англ. mix in) — элемент языка программирования (обычно класс или модуль), реализующий какое-либо чётко выделенное поведение. Используется для уточнения поведения других классов, не предназначен для порождения самостоятельно используемых объектов.
Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Абстрактный класс может содержать (и не содержать) абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Абстрактные классы представляют собой наиболее общие абстракции, то есть имеющие наибольший.
Запись — агрегатный тип данных, инкапсулирующий без сокрытия набор значений различных типов.
Инкапсуляция (англ. encapsulation, от лат. in capsula) — в информатике упаковка данных и функций в единый компонент.
Дестру́ктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).
Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
Мона́да — это абстракция линейной цепочки связанных вычислений. Монады позволяют организовывать последовательные вычисления.
В информатике и теории автоматов состояние цифровой логической схемы или компьютерной программы является техническим термином для всей хранимой информации, к которой схема или программа в данный момент времени имеет доступ. Вывод данных цифровой схемы или компьютерной программы в любой момент времени полностью определяется его текущими входными данными и его состоянием.
Область видимости (англ. scope) в программировании — часть программы, в пределах которой идентификатор, объявленный как имя некоторой программной сущности (обычно — переменной, типа данных или функции), остаётся связанным с этой сущностью, то есть позволяет посредством себя обратиться к ней. Говорят, что идентификатор объекта «виден» в определённом месте программы, если в данном месте по нему можно обратиться к данному объекту. За пределами области видимости тот же самый идентификатор может быть.
Идиома программирования — устойчивый способ выражения некоторой составной конструкции в одном или нескольких языках программирования. Идиома является шаблоном решения задачи, записи алгоритма или структуры данных путём комбинирования встроенных элементов языка.
Пространство имён — некоторое множество каким-либо образом взаимосвязанных имён или терминов.
Динамическая идентификация типа данных (англ. run-time type information, run-time type identification, RTTI) — механизм в некоторых языках программирования, который позволяет определить тип данных переменной или объекта во время выполнения программы.
Из-за путаницы с терминологией словом «оператор» в программировании нередко обозначают операцию (англ. operator), см. Операция (программирование).Инстру́кция или опера́тор (англ. statement) — наименьшая автономная часть языка программирования; команда или набор команд. Программа обычно представляет собой последовательность инструкций.
Мно́жественное насле́дование — свойство, поддерживаемое частью объектно-ориентированных языков программирования, когда класс может иметь более одного суперкласса (непосредственного класса-родителя), интерфейсы поддерживают множественное наследование во многих языках программирования. Эта концепция является расширением «простого (или одиночного) наследования» (англ. single inheritance), при котором класс может наследоваться только от одного суперкласса.
Объе́кт в программировании — некоторая сущность в цифровом пространстве, обладающая определённым состоянием и поведением, имеющая определенные свойства (атрибуты) и операции над ними (методы). Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые определяют поведение (являются моделью) объекта. Термины «экземпляр класса» и «объект» взаимозаменяемы.
Таблица виртуальных методов (англ. virtual method table, VMT) — координирующая таблица или vtable — механизм, используемый в языках программирования для поддержки динамического соответствия (или метода позднего связывания).
Абстра́ктный тип да́нных (АТД) — это математическая модель для типов данных, где тип данных определяется поведением (семантикой) с точки зрения пользователя данных, а именно в терминах возможных значений, возможных операций над данными этого типа и поведения этих операций.
Интроспекция (англ. type introspection) в программировании — возможность запросить тип и структуру объекта во время выполнения программы. Особое значение имеет в языке Objective C, однако имеется почти во всех языках, позволяющих манипулировать типами объектов как объектами первого класса; среди языков, поддерживающих интроспекцию — C++ (с RTTI), Go, Java, JavaScript, Perl, Ruby, Smalltalk; в PHP и Python интроспекция интегрирована в сам язык. Интроспекция может использоваться для реализации ad-hoc-полиморфизма.
Ссылка в программировании — это объект, указывающий на определенные данные, но не хранящий их. Получение объекта по ссылке называется разыменованием.
Объе́ктный мо́дуль (также — объектный файл, англ. object file) — файл с промежуточным представлением отдельного модуля программы, полученный в результате обработки исходного кода компилятором. Объектный файл содержит в себе особым образом подготовленный код (часто называемый двоичным или бинарным), который может быть объединён с другими объектными файлами при помощи редактора связей (компоновщика) для получения готового исполнимого модуля либо библиотеки.
Зарезерви́рованное сло́во (или ключево́е сло́во) — в языках программирования слово, имеющее специальное значение. Идентификаторы с такими именами запрещены.
Интерфейс (англ. interface) — основной шаблон проектирования, являющийся общим методом для структурирования компьютерных программ для того, чтобы их было проще понять. В общем, интерфейс — это класс, который обеспечивает программисту простой или более программно-специфический способ доступа к другим классам.
Наследование (англ. inheritance) — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
По одной из классификаций, языки программирования неформально делятся на сильно и слабо типизированные (англ. strongly and weakly typed), то есть обладающие сильной или слабой системой типов. Эти термины не являются однозначно трактуемыми, и чаще всего используются для указания на достоинства и недостатки конкретного языка. Существуют более конкретные понятия, которые и приводят к называнию тех или иных систем типов «сильными» или «слабыми».
В программировании термин «директива» (указание) по использованию похож на термин «команда», так как также используется для описания некоторых конструкций языка программирования (то есть указаний компилятору или ассемблеру особенностей обработки при компиляции).
Побо́чные эффе́кты (англ. side effects) — любые действия работающей программы, изменяющие среду выполнения (англ. execution environment). Например, к побочным эффектам относятся.
В объектно-ориентированном программировании под агрегированием (или как его еще называют — делегированием) подразумевают методику создания нового класса из уже существующих классов путём их включения. Об агрегировании также часто говорят как об «отношении принадлежности» по принципу «у машины есть корпус, колёса и двигатель».
Фу́нкция вы́сшего поря́дка — в программировании функция, принимающая в качестве аргументов другие функции или возвращающая другую функцию в качестве результата. Основная идея состоит в том, что функции имеют тот же статус, что и другие объекты данных. Использование функций высшего порядка приводит к абстрактным и компактным программам, принимая во внимание сложность производимых ими вычислений.
Функции первого класса являются неотъемлемой частью функционального программирования, в котором использование функций высшего порядка является стандартной практикой. Простым примером функции высшего порядка будет функция Map, которая принимает в качестве своих аргументов функцию и список и возвращается список, после применения функции к каждому элементу списка. Чтобы язык программирования поддерживал Map, он должен поддерживать передачу функций как аргумента.
Код операции, операционный код, опкод — часть машинного языка, называемая инструкцией и определяющая операцию, которая должна быть выполнена.
Множество — тип и структура данных в информатике, которая является реализацией математического объекта множество.
Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.
Сравне́ние в программировании — общее название ряда операций над па́рами значений одного типа, реализующих математические отношения равенства и порядка. В языках высокого уровня такие операции, чаще всего, возвращают булево значение («истина» или «ложь»).
Ленивые вычисления (англ. lazy evaluation, также отложенные вычисления) — применяемая в некоторых языках программирования стратегия вычисления, согласно которой вычисления следует откладывать до тех пор, пока не понадобится их результат. Ленивые вычисления относятся к нестрогим вычислениям. Усовершенствованная модель ленивых вычислений — оптимистичные вычисления — переходит в разряд недетерминированных стратегий вычисления.
Библиотека стандартных шаблонов (STL) (англ. Standard Template Library) — набор согласованных обобщённых алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++.
Кома́нда — это указание компьютерной программе действовать как некий интерпретатор для решения задачи. В более общем случае, команда — это указание некоему интерфейсу командной строки, такому как shell.
Литерал (англ. literal ) — запись в исходном коде компьютерной программы, представляющая собой фиксированное значение. Литералами также называют представление значения некоторого типа данных.
Публичные поля классов
Примечание: Эта страница описывает экспериментальные возможности.
Публичные и приватные поля — это экспериментальная функция (stage 3), предложенная комитетом по стандарту JavaScript TC39.
Поддержка этой возможности в браузерах ограничена, но ее можно использовать посредством транспилирования с такими системами как Babel. Смотрите информацию о совместимости ниже.
И статические, и публичные поля являются изменяемыми, перечисляемыми, настраиваемыми свойствами. Таким образом, в отличие от приватных полей, они участвуют в прототипном наследовании.
Синтаксис
class ClassWithInstanceField instanceField = "instance field"; > class ClassWithStaticField static staticField = "static field"; > class ClassWithPublicInstanceMethod publicMethod() return "hello world"; > >
Примеры
Публичные статические поля
Публичные статические поля полезны тогда, когда необходимо существование одного единственного поля для всего класса, а не для каждого созданного экземпляра по отдельности. Это полезно для кеша, конфигураций или любых прочих данных, которые одинаковы для всех экземпляров.
Публичные статические поля объявляются при помощи ключевого слова static . Они добавляются в конструктор класса во время его создания с помощью Object.defineProperty() . Доступ также осуществляется через конструктор класса.
class ClassWithStaticField static staticField = "static field"; > console.log(ClassWithStaticField.staticField); // Ожидаемый вывод: "static field"
Поля без инициализации имеют значение («javascript.classes») .
class ClassWithStaticField static staticField; > console.assert(ClassWithStaticField.hasOwnProperty("staticField")); console.log(ClassWithStaticField.staticField); // Ожидаемый вывод: "undefined"
Публичные статические поля не переопределяются в наследниках класса, а могут быть доступны через иерархию прототипов.
class ClassWithStaticField static baseStaticField = "base field"; > class SubClassWithStaticField extends ClassWithStaticField static subStaticField = "sub class field"; > console.log(SubClassWithStaticField.subStaticField); // Ожидаемый вывод: "sub class field" console.log(SubClassWithStaticField.baseStaticField); // Ожидаемый вывод: "base field"
При определении полей this ссылается на конструктор класса. Также можно обратиться к нему по имени и использовать super для получения конструктора базового класса, если он существует.
class ClassWithStaticField static baseStaticField = "base static field"; static anotherBaseStaticField = this.baseStaticField; static baseStaticMethod() return "base static method output"; > > class SubClassWithStaticField extends ClassWithStaticField static subStaticField = super.baseStaticMethod(); > console.log(ClassWithStaticField.anotherBaseStaticField); // Ожидаемый вывод: "base static field" console.log(SubClassWithStaticField.subStaticField); // Ожидаемый вывод: "base static method output"
Публичные поля экземпляра
Такие публичные поля имеются у каждого экземпляра данного класса. Объявляя публичные поля, мы можем гарантировать, что поле всегда присутствует, а объявление класса является более самодокументированным.
Публичные поля экземпляра добавляются через Object.defineProperty() либо перед тем, как будет исполнено тело конструктора в базовом классе, либо после того, как завершится super() в классе наследнике.
class ClassWithInstanceField instanceField = "instance field"; > const instance = new ClassWithInstanceField(); console.log(instance.instanceField); // Ожидаемый вывод: "instance field"
Поля без инициализации имеют значение undefined .
class ClassWithInstanceField instanceField; > const instance = new ClassWithInstanceField(); console.assert(instance.hasOwnProperty("instanceField")); console.log(instance.instanceField); // Ожидаемый вывод: "undefined"
Как и свойства, названия полей могут вычисляться.
const PREFIX = "prefix"; class ClassWithComputedFieldName [`$PREFIX>Field`] = "prefixed field"; > const instance = new ClassWithComputedFieldName(); console.log(instance.prefixField); // Ожидаемый вывод: "prefixed field"
При определении полей this ссылается на создающийся экземпляр класса. Как и в публичных методах экземпляра, получить доступ к прототипу базового класса можно с помощью super .
class ClassWithInstanceField baseInstanceField = "base field"; anotherBaseInstanceField = this.baseInstanceField; baseInstanceMethod() return "base method output"; > > class SubClassWithInstanceField extends ClassWithInstanceField subInstanceField = super.baseInstanceMethod(); > const base = new ClassWithInstanceField(); const sub = new SubClassWithInstanceField(); console.log(base.anotherBaseInstanceField); // Ожидаемый вывод: "base field" console.log(sub.subInstanceField); // Ожидаемый вывод: "base method output"
Публичные методы
Публичные статические методы
Ключевое слово static объявляет статический метод класса. Статические методы не вызываются из экземпляра, вместо этого они вызывается из самого класса. Чаще всего это какие-либо служебные функции, такие как функции создания или копирования объектов.
class ClassWithStaticMethod static staticMethod() return "static method has been called."; > > console.log(ClassWithStaticMethod.staticMethod()); // expected output: "static method has been called."
Статические методы добавляются в конструктор класса с помощью Object.defineProperty() во время его создания. Эти методы — изменяемые, неперечисляемые и настраиваемые свойства объекта.
Публичные методы экземпляра
Как и следует из названия, публичные методы экземпляра это методы, доступные для вызова из экземпляров.
class ClassWithPublicInstanceMethod publicMethod() return "hello world"; > > const instance = new ClassWithPublicInstanceMethod(); console.log(instance.publicMethod()); // Ожидаемый вывод: "hello world"
Публичные методы добавляются в прототип класса во время его создания с помощью Object.defineProperty() . Они изменяемы, неперечисляемы и настраиваемы.
Вы можете использовать генераторы, асинхронные функции и асинхронные генераторы.
class ClassWithFancyMethods *generatorMethod() > async asyncMethod() > async *asyncGeneratorMethod() > >
Внутри методов экземпляра, this ссылается на сам экземпляр. В классах наследниках, super даёт доступ к прототипу базового класса, позволяя вызывать его методы.
class BaseClass msg = "hello world"; basePublicMethod() return this.msg; > > class SubClass extends BaseClass subPublicMethod() return super.basePublicMethod(); > > const instance = new SubClass(); console.log(instance.subPublicMethod()); // Ожидаемый вывод: "hello world"
Геттеры и сеттеры это специальные методы, которые привязаны к свойствам класса и которые вызываются, когда к свойству обращаются или записывают. Используйте get и set для объявления публичных геттеров и сеттеров экземпляра.
class ClassWithGetSet #msg = "hello world"; get msg() return this.#msg; > set msg(x) this.#msg = `hello $x>`; > > const instance = new ClassWithGetSet(); console.log(instance.msg); // Ожидаемый вывод: "hello world" instance.msg = "cake"; console.log(instance.msg); // Ожидаемый вывод: "hello cake"
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-class-definitions |
Браузерная совместимость
BCD tables only load in the browser
Смотрите также
- Публичные и приватные поля классов статья на сайте v8.dev.
- Объявление полей класса в JavaScript, от авторов Публичных и приватных полей экземпляра
- Семантика всех элементов JS класса
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Что означает поле класса, которое содержит объект данного класса?
@AndrewKachalin Та конструкция, как у вас (без static ) может подойти, например, для построения цепи прадед-дед-отец-сын-внук. . Т.е. каждый объект содержит потомка своего же класса. Если со static — то это 99% синглтон. Про него можете сами почитать
13 ноя 2017 в 19:11
@rjhdby валидная, но не в контексте синглтона)
13 ноя 2017 в 19:16
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вот в таком виде
class One
Это обычное свойство объекта. Никто не мешает объекту иметь свойство того же класса, к которому принадлежит и он сам. Например так можно реализовать стишок «За деревом дерево, и за деревом дерево, и за деревом дерево, вот и кончился лес (т.е. в последнем объекте это поле null )». В принципе так можно описать любую древовидную (рекурсивную) структуру. Вот вам узел бинарного дерева например:
class Node
Если же мы видим такое
class One
То тут это поле является полем класса. Т.е. оно является общим для всех экземпляров класса. Обычно такие конструкции, вкупе с приватным конструктором и методом getInstance() :
private One() public static One getInstance() < //самая простая реализация if(instance == null) instance = new One(); return instance; >
Обеспечивает, что будет создан один и только один экземпляр этого класса, который будет храниться в поле instance и порлучить который можно через One.getInstance() . Т.е. синглтон.