рдХреНрд▓рд╛рд╕ рдХреЗ рдлрд╝реАрд▓реНрдб рдФрд░ рддрд░реАрдХреЗ

реЮреАрд▓реНрдб

рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрд▓рд╛рди рд╕реАрдзреЗ рдХреНрд▓рд╛рд╕ рдХреЗ рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рдлрд╝ рддреМрд░ рдкрд░ рдирд╣реАрдВ рдХреЛ this рд╡реИрд▓реНрдпреВ рдХреА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рддреМрд░ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирддреАрдЬрд╛ рдпрд╣реА рд╣реЛрддрд╛ рд╣реИ: рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЙрд╕реА рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

рд╡реИрд▓реНрдпреВ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдпрд╣ рдЕрдХреНрд╕рд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реИрд▓реНрдпреВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж рд▓реЙрдЬрд┐рдХ, рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

class MyClass {
    myResult = false;
    set setValue( myValue ) {
        this.myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> Object { myResult: false }

myClassInstance.setValue = true;

myClassInstance;\
> Object { myResult: true }

рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдб, рдХреНрд▓рд╛рд╕ рд╕реЗ рдЬреБрдбрд╝реА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ this рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ. рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрд▓рд╛рд╕ рдХреА рддрд░рд╣ рд╣реА рдХрд░рддреЗ рд╣реИрдВ.

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

рдлрд╝реАрд▓реНрдб, рдХреНрд▓рд╛рд╕ рдХреА рдХреБрдЫ рдЬрд╝реНрдпрд╛рджрд╛ рдмреЗрд╣рддрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ.

рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдФрд░ рддрд░реАрдХреЗ

рдХреНрд▓рд╛рд╕ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдФрд░ рддрд░реАрдХреЛрдВ рдХреЛ рдРрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛. рдирд┐рдЬреА рдкреНрд░реЙрдкрд░реНрдЯреА, рдХреНрд▓рд╛рд╕ рдХреЗ рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ. рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЗрд╕рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ, рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдФрд░ рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ.

рдХрд┐рд╕реА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдирд┐рдЬреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ # рдЬреЛрдбрд╝реЗрдВ, рдЬрдм рдЗрд╕рдХрд╛ рдПрд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {}
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myPrivateField: true }
    #myPrivateField: true
    <prototype>: Object { тАж }
        constructor: class MyClass {}
        <prototype>: Object { тАж }

рд╢рд╛рдорд┐рд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП. рдЖрдк рдЗрд╕рдХреА рд╡реИрд▓реНрдпреВ рдХреЛ рдмрд╛рдж рдореЗрдВ, this рдХреА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рддреМрд░ рдкрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ this рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ.

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдХреЛ рдРрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛. рдЗрд╕рдХреА рд╡рдЬрд╣ рд╕реЗ, рдбреЗрдЯрд╛ рдЦрд░реНрдЪ рдирд╣реАрдВ рд╣реЛ рдкрд╛ рд░рд╣рд╛ рд╣реИ рджреА рдЧрдИ рдЧреИрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдмрджрд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╕рд╛рде рд╣реА, рдпрд╣ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рд╕рд┐рд░реНрдлрд╝ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ.

class MyClass {
    #myResult = false;
    set setValue( myValue ) {
        this.#myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myResult: false }

myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult

myClassInstance.setValue = true;

myClassInstance;\
> MyClass { #myResult: true }

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЖрдо рддреМрд░ рдкрд░, рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдЕрдиреБрдорддрд┐ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ. рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб рдХрд╛ рдРрдХреНрд╕реЗрд╕ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордХрд╕рдж:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> true

myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

myClassInstance.#myPrivateMethod();
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateMethod

рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб, рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрди рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╡реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рднреА рдкреИрд░рдВрдЯ рдХреНрд▓рд╛рд╕:

class MyClass {
    #myPrivateField = true;
}
class ChildClass extends MyClass {
    childMethod() {
        console.log( this.#myPrivateField );
    }
}
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реАрд▓реНрдб рдФрд░ рддрд░реАрдХреЗ

рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реАрд▓реНрдб рдФрд░ рдореЗрдердб, рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рди рдХрд┐ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП. рдЗрд╕ рдХрд╛рд░рдг, рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдб рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯ рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рд╣рд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдпреВрдиреАрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА рдЬрд╝рд░реВрд░рдд рдкрдбрд╝ рд╕рдХрддреА рд╣реИтАФрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реЗрдпрд░ рдХреА рдЧрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрд╛рдирдХрд╛рд░реА. рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЗ рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рдпреВрдЯрд┐рд▓рд┐рдЯреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдореМрдЬреВрдж рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЙрдирдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдо рд╕реЗ рд▓рдЧрд╛рдирд╛.

рдХреНрд▓рд╛рд╕ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реАрд▓реНрдб рдФрд░ рдореЗрдердб рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, static рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ рдХреАрд╡рд░реНрдб:

class MyClass {
    static myStaticField;
    static myStaticMethod() {}
}
const myClassInstance = new MyClass();

рд╕реНрдЯреИрдЯрд┐рдХ рддрд░реАрдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЙрдЯ рдиреЛрдЯреЗрд╢рди рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

class MyClass {
    constructor() {}
}
MyClass.myStaticMethod = function() {}

рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗ рд╕реНрдЯреИрдЯрд┐рдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдРрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАрдВ, рд▓реЗрдХрд┐рди рдпреЗ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ:

class MyClass {
    static myStaticField = true;
    static myStaticMethod() {
        console.log( "A static method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance.myStaticField;
> undefined

myClassInstance.myStaticMethod();
> Uncaught TypeError: myClassInstance.myStaticMethod is not a function

MyClass.myStaticField;
> true

MyClass.myStaticMethod();
> "A static method."

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдЯрд┐рдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдмрдирд╛рдирд╛. рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдХреНрд░рдо рд╕реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рддрд░реАрдХрд╛ рдпрд╛ рдХреЛрдИ рд╕реНрдЯреИрдЯрд┐рдХ рддрд░реАрдХрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЬрд╝рд░реВрд░реА рд╕реЗрдЯрдЕрдк рд╢рд╛рдорд┐рд▓ рд╣реЛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

class User {
    constructor( name, email ) {
        this.name = name;
        this.email = email;
    }
    static fromObject( myObject ) {
        return new User( myObject.name, myObject.email ?? "Omitted" );
    }
}
const userObject = {
    "name" : "My Name",
    "email" : "my@email.address"
};
const secondUserObject = {
    "name" : "My Name"
};

const firstUser = User.fromObject( userObject );
const secondUser = User.fromObject( secondUserObject );

firstUser;
> Object { name: "My Name", email: "my@email.address" }

secondUser;
> Object { name: "My Name", email: "Omitted" }

рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рддрдирд╛ рд╕рдордЭ рдЖрдпрд╛ рд╣реИ

рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд┐рд░реНрдлрд╝ рдпрд╣рд╛рдВ рд╕реЗ рдРрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреА рдорджрдж рд╕реЗ рдХреИрд╕реЗ рдореИрдиреЗрдЬ рдХрд░реЗрдВ?

рдирд┐рдЬреА рдлрд╝реАрд▓реНрдб
рдХреНрд▓рд╛рд╕ рдХреЗ рдлрд╝реАрд▓реНрдб
Static fields