From 980fe00a74a9ad013b945755415ace2e5429c3c2 Mon Sep 17 00:00:00 2001
From: Alexey Pyltsyn Первый способ определения класса — class declaration (объявление класса). Для этого необходимо воспользоваться ключевым словом Разница между объявлением функции (function declaration) и объявлением класса (class declaration) в том, что объявление функции совершает подъём ({{Glossary("Hoisting", "hoisting")}}), в то время как объявление класса — нет. Поэтому вначале необходимо объявить ваш класс и только затем работать с ним, а код же вроде следующего сгенерирует исключение типа {{jsxref("ReferenceError")}}: Второй способ определения класса — class expression (выражение класса). Можно создавать именованные и безымянные выражения. В первом случае имя выражения класса находится в локальной области видимости класса и может быть получено через свойства самого класса, а не его экземпляра. Смотрите также определение методов. Ключевое слово Когда статический или прототипный метод вызывается без привязки к this объекта (или когда this является типом boolean, string, number, undefined, null), тогда this будет иметь значение undefined внутри вызываемой функции. Автоупаковка не будет произведена. Поведение будет таким же как если бы мы писали код в нестрогом режиме. Если мы напишем этот же код используя классы основанные на функциях, тогда произойдёт автоупаковка основанная на значении this, в течение которого функция была вызвана. В строгом режиме автоупаковка не произойдёт - значение this останется прежним.class
и указать имя класса (в примере — «Rectangle»).class Rectangle {
+
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
@@ -33,7 +33,7 @@ translation_of: Web/JavaScript/Reference/Classes
var p = new Rectangle(); // ReferenceError
+
@@ -41,7 +41,7 @@ class Rectangle {}var p = new Rectangle(); // ReferenceError
class Rectangle {}
// безымянный
+
// безымянный
var Rectangle = class {
constructor(height, width) {
this.height = height;
@@ -84,7 +84,7 @@ console.log(Rectangle.name);
class Rectangle {
+
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
@@ -107,7 +107,7 @@ console.log(square.area); // 100
static
, определяет статический метод или свойства для класса. Статические методы и свойства вызываются без инстанцирования их класса, и не могут быть вызваны у экземпляров (instance) класса. Статические методы, часто используются для создания служебных функций для приложения, в то время как статические свойства полезны для кеширования в рамках класса, фиксированной конфигурации или любых других целей, не связанных с реплецированием данных между экземплярами.class Point {
+
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
@@ -136,7 +136,7 @@ console.log(Point.distance(p1, p2)); // 7.0710678118654755
class Animal {
+
class Animal {
speak() {
return this;
}
@@ -156,7 +156,7 @@ eat(); // undefined
function Animal() { }
+
function Animal() { }
Animal.prototype.speak = function(){
return this;
@@ -178,7 +178,7 @@ eat(); // глобальный объект (нестрогий режим)Свойства экземпляра должны быть определены в методе класса:
class Rectangle { +class Rectangle { constructor(height, width) { this.height = height; this.width = width; @@ -187,7 +187,7 @@ eat(); // глобальный объект (нестрогий режим)Статические (class-side) свойства и свойства прототипа должны быть определены за рамками тела класса: -Rectangle.staticWidth = 20; +Rectangle.staticWidth = 20; Rectangle.prototype.prototypeWidth = 25;@@ -201,7 +201,7 @@ Rectangle.prototype.prototypeWidth = 25;Используя Javascript синтаксис определения полей, приведённый выше пример может быть изменён следующим образом:
-class Rectangle { +class Rectangle { height = 0; width; constructor(height, width) { @@ -218,7 +218,7 @@ Rectangle.prototype.prototypeWidth = 25;Предыдущий пример может быть изменён следующим образом, используя приватные поля:
-class Rectangle { +class Rectangle { #height = 0; #width; constructor(height, width) { @@ -241,7 +241,7 @@ Rectangle.prototype.prototypeWidth = 25;Ключевое слово
-extends
используется в объявлениях классов и выражениях классов для создания класса, дочернего относительно другого класса.class Animal { +
class Animal { constructor(name) { this.name = name; }
@@ -268,7 +268,7 @@ d.speak(); // Митци лаетАналогичным образом можно расширять традиционные, основанные на функциях "классы":
-function Animal (name) { +
function Animal (name) { this.name = name; } Animal.prototype.speak = function () { @@ -288,7 +288,7 @@ d.speak(); // Митци лает
Обратите внимание, что классы не могут расширять обычные (non-constructible) объекты. Если вам необходимо создать наследование от обычного объекта, в качестве замены можно использовать {{jsxref("Object.setPrototypeOf()")}}:
-var Animal = { +
var Animal = { speak() { console.log(
`${this.name} издаёт звук.`); } @@ -312,7 +312,7 @@ d.speak(); // Митци издаёт звук.
Например, при использовании таких методов, как {{jsxref("Array.map", "map()")}}, который возвращает конструктор по умолчанию, вам хотелось бы, чтобы они возвращали родительский объект
-Array
вместо объектаMyArray
. Символ {{jsxref("Symbol.species")}} позволяет это реализовать:class MyArray extends Array { +
class MyArray extends Array { // Изменить species на родительский конструктор Array static get [Symbol.species]() { return Array; } } @@ -326,7 +326,7 @@ console.log(mapped instanceof Array); // true
Ключевое слово
-super
используется для вызова функций на родителе объекта.class Cat { +
class Cat { constructor(name) { this.name = name; } @@ -355,7 +355,7 @@ l.speak();
Для реализации mix-ins в ECMAScript можно использовать функцию, которая в качестве аргумента принимает родительский класс, а возвращает подкласс, его расширяющий:
-var calculatorMixin = Base => class extends Base { +
var calculatorMixin = Base => class extends Base { calc() { } }; @@ -365,7 +365,7 @@ var randomizerMixin = Base => class extends Base {
Класс, использующий такие mix-ins, можно описать следующим образом:
-class Foo { } +
class Foo { } class Bar extends calculatorMixin(randomizerMixin(Foo)) { }
Спецификации
-- cgit v1.2.3-54-g00ecf