Предложение 2022 года добавляет функции, описанные в следующей таблице, в класс ECMAScript (зеленый цвет — это существующая функция).
Предварительное знание
в пониманииClass
Перед функцией поля мы должны понимать некоторые концепции объектно-ориентированного программирования. Без дальнейшего ADO ответы на картинке выше.
Свойства, связанные с полем класса
Используйте декларативные поля класса
Начиная с класса ES6, мы можем использовать в JavaScriptclass
ключевые слова для написания кода в традиционных парадигмах объектно-ориентированного программирования.
Но в версии ES6Class
, мы можем создавать общедоступные методы экземпляра и статические методы только для этого класса. Если вы хотите объявить поля класса, вы можете использовать их только вconstructor
непосредственно черезthis
Реализация задания:
class Pokemon {
constructor() {
this.name = "Pikachu";
}
attack() {}
static starter() {}
}
Этот подход не интуитивно понятен инженерной практике и читателям кода.
Мы предпочитаем иметь декларативные поля класса, чтобы читатели кода могли понять структуру данных этого класса и быстро понять всю картину этого класса, не читая код процесса.
В предложении ES2022 мы можем использовать поля декларативного класса.
class Pokemon {
name = "Pikachu";
attack() {}
static starter() {}
}
Предлагаемые функции в настоящее время находятся вChrome 74
,Node 12
,Safari
,TypeScript 3.8
,Babel 7.0+
и т. д. использование в окружающей среде
частные свойства/частные методы
Одно из последних предложений — способ добавления приватных переменных в классы.
мы будем использовать# 符号表示类的私有变量
. Это избавляет от необходимости использовать замыкания для сокрытия закрытых переменных, которые вы не хотите показывать внешнему миру.
пройти через#
Измененная переменная-член или функция-член становится частной переменной, если вы попытаетесьClass
Внешний доступ вызовет исключение. Эта функция теперь доступна в последних версиях Chrome и Node.js.
class Student {
#name = "something";
#name2 = "name2";
// 实例私有方法-只能在此Class内部使用
#instancePrivateMethod() {
console.log("实例私有方法");
}
}
статическое поле
Это позволяет классам иметь статические поля, подобные большинствуOOP
язык. Статические поля можно использовать вместо перечислений, а также частных полей.
class Student {
// 静态私有字段声明-只能在此Class内部使用
static #staticFieldPrivateName = "静态私有字段声明:真名-王撕葱";
// 静态公有字段声明
static staticFieldPublicName = "静态公有字段声明:名-撕葱";
// 静态公有方法-ES6已支持
static staticPublicMethod() {
console.log("静态公有方法");
}
// 静态私有方法-只能在此Class内部使用
static #staticPrivateMethod() {
console.log("#staticPrivateMethod:", "静态私有方法");
}
}
Приватные методы и геттеры/сеттеры классов JavaScript
может использоваться внутри "класса"get
а такжеset
Ключевое слово, установите функцию значения и функцию значения для свойства и перехватите поведение доступа к свойству.
В приведенном выше кодеprop
Свойства имеют соответствующие функции сохранения и значения, поэтому поведение присваивания и чтения настраивается.
Частные свойства также могут иметь методы получения и установки.
class Student {
#name = "something";
#name2 = "name2";
// 只能在此Class内部使用
get #privateGet() {
return this.#name;
}
// 只能在此Class内部使用
set #privateSet(value) {
this.#name = value;
}
get publicGet() {
return this.#name2;
}
set publicSet(value) {
this.#name2 = value;
}
}
Статические общедоступные/приватные поля
Сценарий: использовать как перечисление
class ColorFinder {
static #red = "#ff0000";
static #green = "#00ff00";
static #blue = "#0000ff";
static colorName(name) {
switch (name) {
case "red":
return ColorFinder.#red;
case "blue":
return ColorFinder.#blue;
case "green":
return ColorFinder.#green;
default:
throw new RangeError("unknown color");
}
}
// Somehow use colorName
}
Сводка полей класса
а такжеСравнение TypeScript
Обычный модификатор '/d'
Сегодня объекты ECMAScript RegExp можно вызыватьexec
способ предоставления информации о матче.
Этот результат являетсяArray
, который содержит информацию о совпадающей подстроке и дополнительные свойства, указывающие входную строку, индекс во входных данных, где было найдено совпадение, и подстроку, содержащую любые именованные группы захвата.groups
объектgroups
объект.
Однако в некоторых более сложных сценариях этой информации может быть недостаточно. Например, ECMScript реализуетTextMate
Подсветка синтаксиса языка требует не только сопоставления индексов, но иначальный и конечный индексы одной группы захвата.
Таким образом, спецификация ESRegExp.prototype.exec()
,String.prototype.match
Результат etc добавляетindexs
Атрибуты.
indexs
Само свойство представляет собой индексированный массив, содержащий пару начальных и конечных индексов для каждой захваченной подстроки.
Любые несопоставленные группы захвата будут неопределенными, как и соответствующие им элементы в массиве подстрок. Кроме того, сам индексный массив будет иметьgroups
Свойства, содержащие начальный и конечный индексы каждой именованной захватываемой группы.
const re1 = /a+(?<Z>z)?/d;
// indices are relative to start of the input string:
const s1 = "xaaaz";
const m1 = re1.exec(s1);
m1.indices[0][0] === 1;
m1.indices[0][1] === 5;
s1.slice(...m1.indices[0]) === "aaaz";
m1.indices[1][0] === 4;
m1.indices[1][1] === 5;
s1.slice(...m1.indices[1]) === "z";
m1.indices.groups["Z"][0] === 4;
m1.indices.groups["Z"][1] === 5;
s1.slice(...m1.indices.groups["Z"]) === "z";
// capture groups that are not matched return `undefined`:
const m2 = re1.exec("xaaay");
m2.indices[1] === undefined;
m2.indices.groups["Z"] === undefined;
плюс/d
позжеm1
значение будет еще одноindices
Атрибуты
ожидание верхнего уровня
В сценарии загрузки по запросуPromise
Сложная проблема цепочки методов
// awaiting.mjs
import { process } from "./some-module.mjs";
const dynamic = import(computedModuleSpecifier);
const data = fetch(url);
export const output = process((await dynamic).default, await data);
// usage.mjs
import { output } from "./awaiting.mjs";
export function outputPlusValue(value) { return output + value }
console.log(outputPlusValue(100));
setTimeout(() => console.log(outputPlusValue(100), 1000);
Справочная документация
наконец
Статья неглубокая, и вы можете оставить свое мнение в области комментариев!
Студенты, которые чувствуют, что они чего-то достигли, могут поставить лайк и подписаться на волну!
Прошлые статьи
- Самая полная стратегия ECMAScript
- Рейдеры самого полного Ecmascript ES2015-ES6
- Самая полная стратегия ECMAScript ES2016-ES7
- Самая полная стратегия ECMAScript ES2017-ES8
- Самая полная стратегия ECMAScript ES2018-ES9
- Самая полная стратегия ECMAScript ES2019-ES10
- Самая полная стратегия ECMAScript ES2021-ES11
- Самая полная стратегия ECMAScript ES2020-ES12
- Наиболее полная стратегия ECMAScript ES2022-ES13