СвойÑÑва клаÑÑа по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ Ð¾Ð±ÑедоÑÑÑпнÑми и могÑÑ Ð±ÑÑÑ ÑаÑÑмоÑÑÐµÐ½Ñ Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð²Ð½Ðµ клаÑÑа. Тем не менее, еÑÑÑ ÑкÑпеÑименÑалÑное пÑедложение, позволÑÑÑее опÑеделиÑÑ Ð¿ÑиваÑнÑе Ð¿Ð¾Ð»Ñ ÐºÐ»Ð°ÑÑа, иÑполÑзÑÑ Ð¿ÑеÑÐ¸ÐºÑ Ñ
ÑÑа #
.
class ClassWithPrivateField { #privateField } class ClassWithPrivateMethod { #privateMethod() { return 'hello world' } } class ClassWithPrivateStaticField { static #PRIVATE_STATIC_FIELD }ÐÑимеÑÑ ÐÑиваÑнÑе ÑÑаÑиÑеÑкие полÑ
ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð² конÑÑÑÑкÑоÑе клаÑÑа изнÑÑÑи Ñамой деклаÑаÑии клаÑÑа.
ÐгÑаниÑение ÑÑаÑиÑеÑÐºÐ¸Ñ Ð¿ÐµÑеменнÑÑ , вÑзÑваемÑÑ ÑолÑко ÑÑаÑиÑеÑкими меÑодами, вÑе еÑÑ ÑÐ¾Ñ ÑанÑеÑÑÑ.
class ClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD;
static publicStaticMethod() {
ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42;
return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD;
}
}
console.assert(ClassWithPrivateStaticField.publicStaticMethod() === 42);
ÐÑиваÑнÑе ÑÑаÑиÑеÑкие Ð¿Ð¾Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² конÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа во вÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑки клаÑÑа.
СÑÑеÑÑвÑÐµÑ Ð¾Ð³ÑаниÑение по пÑоиÑÑ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑаÑÑнÑÑ ÑÑаÑиÑеÑÐºÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹. ТолÑко клаÑÑ, коÑоÑÑй опÑеделÑÐµÑ Ð¿ÑиваÑное ÑÑаÑиÑеÑкое поле, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»Ñ.
ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ñи иÑполÑзовании this.
class BaseClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD;
static basePublicStaticMethod() {
this.#PRIVATE_STATIC_FIELD = 42;
return this.#PRIVATE_STATIC_FIELD;
}
}
class SubClass extends BaseClassWithPrivateStaticField {}
let error = null;
try {
SubClass.basePublicStaticMethod();
} catch (e) {
error = e;
}
console.assert(error instanceof TypeError);
ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ ÑкземплÑÑов
ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ ÑкземплÑÑов обÑÑвлÑÑÑÑÑ #Ð¸Ð¼Ñ (пÑоизноÑиÑÑÑ ÐºÐ°Ðº "Ñ
ÑÑ Ð½ÑймÑ"), коÑоÑÑе иденÑиÑиÑиÑÑÑÑÑÑ Ð¿ÑеÑикÑом #
. #
ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð¸, а Ñакже иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸ доÑÑÑпа.
ÐнкапÑÑлÑÑÐ¸Ñ Ð¾Ð±ÐµÑпеÑиваеÑÑÑ ÑзÑком. ÐбÑаÑение к #
именам вне облаÑÑи видимоÑÑи ÑвлÑеÑÑÑ ÑинÑакÑиÑеÑкой оÑибкой.
class ClassWithPrivateField {
#privateField;
constructor() {
this.#privateField = 42;
this.#randomField = 666; // Syntax error
}
}
const instance = new ClassWithPrivateField();
instance.#privateField === 42; // Syntax error
ÐÑиваÑнÑе меÑÐ¾Ð´Ñ ÐÑиваÑнÑе ÑÑаÑиÑеÑкие меÑодÑ
ÐÑиваÑнÑе ÑÑаÑиÑеÑкие меÑодÑ
Ðак и Ð¸Ñ Ð¿ÑблиÑнÑй ÑквиваленÑ, пÑиваÑнÑе ÑÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð²ÑзÑваÑÑÑÑ Ð½Ð° Ñамом клаÑÑе, а не на ÑкземплÑÑÐ°Ñ ÐºÐ»Ð°ÑÑа. Ðак и пÑиваÑнÑе ÑÑаÑиÑеÑкие полÑ, они доÑÑÑÐ¿Ð½Ñ ÑолÑко изнÑÑÑи обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа.
ÐÑиваÑнÑе ÑÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð³ÐµÐ½ÐµÑаÑоÑами, аÑÐ¸Ð½Ñ ÑоннÑми ÑÑнкÑиÑми и аÑÐ¸Ð½Ñ ÑоннÑми ÑÑнкÑиÑми-генеÑаÑоÑами.
class ClassWithPrivateStaticMethod {
static #privateStaticMethod() {
return 42;
}
static publicStaticMethod1() {
return ClassWithPrivateStaticMethod.#privateStaticMethod();
}
static publicStaticMethod2() {
return this.#privateStaticMethod();
}
}
console.assert(ClassWithPrivateStaticMethod.publicStaticMethod1() === 42);
console.assert(ClassWithPrivateStaticMethod.publicStaticMethod2() === 42);
ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ñи его иÑполÑзовании this
. Ð ÑледÑÑÑем пÑимеÑе this
оÑноÑиÑÑÑ Ðº клаÑÑÑ Derived
(а не к клаÑÑÑ Base
), когда Ð¼Ñ Ð¿ÑÑаемÑÑ Ð²ÑзваÑÑ Derived.publicStaticMethod2()
, и, Ñаким обÑазом, Ð¸Ð¼ÐµÐµÑ Ñакое же "огÑаниÑение по пÑоиÑÑ
ождениÑ", как ÑпоминалоÑÑ Ð²ÑÑе:
class Base {
static #privateStaticMethod() {
return 42;
}
static publicStaticMethod1() {
return Base.#privateStaticMethod();
}
static publicStaticMethod2() {
return this.#privateStaticMethod();
}
}
class Derived extends Base {}
console.log(Derived.publicStaticMethod1()); // 42
console.log(Derived.publicStaticMethod2()); // TypeError
ÐÑиваÑнÑе меÑÐ¾Ð´Ñ ÑкземплÑÑов(instance)
ÐÑиваÑнÑе меÑÐ¾Ð´Ñ ÑкземплÑÑов ÑÑо меÑодÑ, доÑÑÑпнÑе Ñ ÑкземплÑÑов клаÑÑа, доÑÑÑп к коÑоÑÑм запÑеÑÑн Ñакже, как Ñ Ð¿ÑиваÑнÑÑ Ð¿Ð¾Ð»ÐµÐ¹ клаÑÑа.
class ClassWithPrivateMethod {
#privateMethod() {
return "hello world";
}
getPrivateMessage() {
return this.#privateMethod();
}
}
const instance = new ClassWithPrivateMethod();
console.log(instance.getPrivateMessage());
// expected output: "hello world"
ÐÑиваÑнÑе меÑÐ¾Ð´Ñ ÑкземплÑÑов могÑÑ Ð±ÑÑÑ Ð³ÐµÐ½ÐµÑаÑоÑом, async, или ÑÑнкÑиÑми async генеÑаÑоÑа. ÐÑиваÑнÑе геÑÑеÑÑ Ð¸ ÑеÑÑеÑÑ Ñакже возможнÑ:
class ClassWithPrivateAccessor {
#message;
get #decoratedMessage() {
return `â¨${this.#message}â¨`;
}
set #decoratedMessage(msg) {
this.#message = msg;
}
constructor() {
this.#decoratedMessage = "hello world";
console.log(this.#decoratedMessage);
}
}
new ClassWithPrivateAccessor();
// expected output: "â¨hello worldâ¨"
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами javascript.classes.private_class_fields javascript.classes.private_class_fields_in javascript.classes.private_class_methods СмоÑÑиÑе Ñакже
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