Baseline Widely available
ÐÑимеÑание: ÐÑа ÑÑÑаниÑа опиÑÑÐ²Ð°ÐµÑ ÑкÑпеÑименÑалÑнÑе возможноÑÑи.
ÐÑблиÑнÑе и пÑиваÑнÑе Ð¿Ð¾Ð»Ñ â ÑÑо ÑкÑпеÑименÑалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ (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"
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4