【JavaScript】プライベートなプロパティとメソッド - 外部からのアクセスを防ぐ

【JavaScript】プライベートなプロパティとメソッド - 外部からのアクセスを防ぐ

JavaScriptのプライベートなプロパティとメソッドについて解説します。

検証環境

プライベート

プライベートなプロパティ・メソッドとは“クラスまたはそのクラスのオブジェクトからのみアクセス可能なプロパティ・メソッドのこと”です。

外部からのアクセスを遮断できるため、不用なプロパティの変更やクラス・オブジェクトの操作を防ぐことができます。

基本構文

プライベートにするプロパティ・メソッドの名前の先頭にシャープ(#)を付けます。

class クラス名 {
    
    // クラスプロパティ
    static #プロパティ名;
    
    // クラスメソッド
    static #メソッド名( 仮引数1, 仮引数2 ... ) {
        // 処理...
    }
    
    // オブジェクトプロパティ
    #プロパティ名;
    
    // オブジェクトメソッド
    #メソッド名( 仮引数1, 仮引数2 ... ) {
        // 処理...
    }
    
}

サンプル

クラスプロパティ

class Person {
    ___ih_hl_start
    static #domain = "HUMAN";
    ___ih_hl_end
    
    static category() {
        console.log(Person.#domain);
    }
    
    introduction() {
        console.log(Person.#domain);
    }
}

Person.category();

let p1 = new Person();
p1.introduction();
HUMAN
HUMAN

2行目のstatic #domain = "HUMAN"がプライベートなクラスプロパティの定義です。

クラスメソッドとオブジェクトメソッドからアクセスに成功しています。

クラスの外部からアクセスすると次のようにエラーが発生することに注意してください。

class Person {
    static #domain = "HUMAN";
}

___ih_hl_start
console.log(Person.#domain);
___ih_hl_end
Uncaught SyntaxError: Private field '#domain' must be declared in an enclosing class

クラスメソッド

class Person {
    ___ih_hl_start
    static #greeting() {
        console.log("Hello.");
    }
    ___ih_hl_end
    
    static message() {
        Person.#greeting();
    }
    
    introduction() {
        Person.#greeting();
    }
}

Person.message();

let p1 = new Person();
p1.introduction();
Hello.
Hello.

2〜4行目がプライベートなクラスメソッドの定義です。

クラスメソッド・オブジェクトメソッドからアクセスに成功しています。

クラスの外部からアクセスすると次のようにエラーが発生することに注意してください。

class Person {
    static #greeting() {
        console.log("Hello.");
    }
}

___ih_hl_start
Person.#greeting();
___ih_hl_end
Uncaught SyntaxError: Private field '#greeting' must be declared in an enclosing class

オブジェクトプロパティ

class Person {
    ___ih_hl_start
    #name;
    ___ih_hl_end
    
    constructor( name ) {
        this.#name = name;
    }
    
    introduction() {
        console.log("My name is " + this.#name + ".");
    }
}

let p1 = new Person("TANAKA");
p1.introduction();
My name is TANAKA.

2行目の#nameがプライベートなオブジェクトプロパティの定義です。

オブジェクトメソッドからアクセスに成功しています。
(クラスメソッドからオブジェクトプロパティへのアクセスはできません。)

クラスの外部からアクセスすると次のようにエラーが発生することに注意してください。

class Person {
    #name;
}

let p = new Person();

___ih_hl_start
p.#name = "TANAKA";
___ih_hl_end
Uncaught SyntaxError: Private field '#name' must be declared in an enclosing class

オブジェクトメソッド

class Person {
    name;
    
    constructor( name ) {
        this.name = name;
    }
    
    ___ih_hl_start
    #greeting() {
        console.log("Hello.");
    }
    ___ih_hl_end
    
    introduction() {
        this.#greeting();
        console.log("My name is " + this.name + ".");
    }
}

let p1 = new Person("TANAKA");
p1.introduction();
Hello.
My name is TANAKA.

8〜10行目がプライベートなオブジェクトメソッドの定義です。

オブジェクトメソッドからアクセスに成功しています。
(クラスメソッドからオブジェクトメソッドへのアクセスはできません。)

クラスの外部からアクセスすると次のようにエラーが発生することに注意してください。

class Person {
    #greeting() {
        console.log("Hello.");
    }
}

let p = new Person();

___ih_hl_start
p.#greeting();
___ih_hl_end
Uncaught SyntaxError: Private field '#greeting' must be declared in an enclosing class