JavaScript でプライベート メンバーを作成する

JavaScript でプライベート メンバーを作成する

序文:

オブジェクト指向プログラミング言語のprivateキーワードは、プロパティとメソッドを、それらが宣言されているクラス内でのみアクセス可能にするために使用できるアクセス修飾子です。これにより、非表示にする必要があり、クラスの外部とやり取りしない基礎ロジックを簡単に非表示にすることができます。

しかし、JavaScript で同様の機能を実現するにはどうすればよいでしょうか? 予約キーワードprivateはありませんが、新しい標準の JavaScript では、クラスのプライベート メンバーを作成するための独自の方法があります。ただし、これはまだ ES2020 の実験的なドラフト段階であり、構文は奇妙で、接頭辞として # が付いています。 JavaScript コードでプライベート プロパティとメソッドを実装する方法はいくつかあります。

1. クロージャを使用する

クロージャは、プライベート プロパティまたはメソッドをカプセル化するために使用できます。クロージャを使用すると、外部関数の変数や機能にアクセスできます。

次のコード スニペット:

関数 MyProfile() {
    const myTitle = "DevPoint";

    戻る {
        getTitle: 関数 () {
            myTitle を返します。
        },
    };
}
定数 myProfile = MyProfile();
console.log(myProfile.getTitle()); // DevPoint


これは、最上位の自己呼び出し関数呼び出しを変数に割り当て、関数の戻り値でその内部関数の一部のみを公開することを意味します。

const ButtonCreator = (関数() {
    定数プロパティ = {
        幅: 100,
        高さ: 50,
    };

    const getWidth = () => properties.width;
    const getHeight = () => properties.height;
    const setWidth = (幅) => (properties.width = 幅);
    const setHeight = (height) => (properties.height = height);

    関数を返す(幅、高さ){
        プロパティの幅 = 幅;
        プロパティの高さ = 高さ;

        戻る {
            幅を取得、
            高さを取得、
            幅の設定、
            高さを設定する、
        };
    };
})();
ボタンを新規作成します。
console.log(button.getHeight()); // 360

2. ES6クラスを使用する

コードを OOP アプローチに近づけるには、ES6 で導入された class キーワードを使用できます。プロパティとメソッドをプライベートにするには、クラス外で定義します。

上記の ButtonCreator の例をリファクタリングして、クラスを使用しましょう。

定数プロパティ = {
    幅: 100,
    高さ: 50,
};

クラス ButtonCreator {
    コンストラクタ(幅, 高さ) {
        プロパティの幅 = 幅;
        プロパティの高さ = 高さ;
    }

    getWidth = () => properties.width;
    getHeight = () => properties.height;
    setWidth = (幅) => (properties.width = 幅);
    setHeight = (高さ) => (properties.height = 高さ);
}
ボタンを新規作成します。
console.log(button.getHeight()); // 360

ここで、プロパティがパブリックであるが、コンテキストがButtonCreatorを指すプライベート メソッドでそれらを使用したい場合は、次の方法で実現できます。

const プライベート = {
    幅を計算する() {
        this.width を返します。
    },
};

クラス ButtonCreator {
    コンストラクタ(幅, 高さ) {
        this.width = 幅;
        this.height = 高さ;
    }

    getWidth = () => privates.calculateWidth.call(this);
    getHeight = () => this.height;
    setWidth = (幅) => (this.width = 幅);
    setHeight = (height) => (this.height = height);
}
ボタンを新規作成します。
console.log(button.getHeight()); // 360

上記のコードでは、指定されたコンテキストで関数を呼び出すために使用されるFunction.prototype.callを使用しています。この例では、 ButtonCreatorクラスのコンテキストが使用されています。

プライベート関数にもパラメータが必要な場合は、呼び出しに追加の引数として渡すことができます。

const プライベート = {
    幅を計算する(パーセント) {
        this.width * パーセントを返します。
    },
};

クラス ButtonCreator {
    コンストラクタ(幅, 高さ) {
        this.width = 幅;
        this.height = 高さ;
    }

    getWidth = () => privates.calculateWidth.call(this, 0.1);
    getHeight = () => this.height;
    setWidth = (幅) => (this.width = 幅);
    setHeight = (height) => (this.height = height);
}
ボタンを新規作成します。
console.log(button.getWidth()); // 60

3. ES2020提案を使用する

これはまだ ES2020 実験ドラフトの段階であり、プライベート メソッドまたはプロパティの定義が導入されています。構文は奇妙で、先頭に # が付きます。

クラス ButtonCreator {
    #幅;
    #身長;
    コンストラクタ(幅, 高さ) {
        this.#width = 幅;
        this.#height = 高さ;
    }
    // プライベートメソッド #calculateWidth() {
        this.#width を返します。
    }

    getWidth = () => this.#calculateWidth();
    getHeight = () => this.#height;
    setWidth = (幅) => (this.#width = 幅);
    setHeight = (height) => (this.#height = height);
}
ボタンを新規作成します。
console.log(button.width); // 未定義
console.log(button.getWidth()); // 600

4. WeakMapを使用する

このアプローチは、クロージャ アプローチに基づいており、スコープ変数アプローチを使用してプライベートWeakMap <String, String> を作成し、その WeakMap を使用してそれに関連付けられたプライベート データを取得します。これは、すべてのインスタンスがWeakMap <String, String> を共有できるため、インスタンスが作成されるたびにメソッドを再作成する必要がないため、スコープ変数アプローチよりも高速です。

const ButtonCreator = (関数() {
    const privateProps = 新しい WeakMap();
    クラス ButtonCreator {
        コンストラクタ(幅、高さ、名前) {
            this.name = name; // パブリックプロパティ privateProps.set(this, {
                width, // プライベート プロパティ height, // プライベート プロパティ calculateWidth: () => privateProps.get(this).width, // プライベート メソッド });
        }

        getWidth = () => privateProps.get(this).calculateWidth();
        getHeight = () => privateProps.get(this).height;
    }
    ButtonCreator を返します。
})();
ボタンを新規作成します。
console.log(button.width); // 未定義
console.log(button.getWidth()); // 600

このアプローチは、プライベート メソッドを使用する場合には少し扱いに​​くいです。

5. TypeScriptを使用する

TypeScript JavaScriptの一種として使用し、 privateキーワードを使用してオブジェクト指向言語の機能を忠実に再現することができます。

クラス ButtonCreator {
    プライベート幅: 数値;
    プライベート高さ: 数値;
    コンストラクタ(幅: 数値, 高さ: 数値) {
        this.width = 幅;
        this.height = 高さ;
    }
    プライベートcalculateWidth() {
        this.width を返します。
    }
    パブリック getWidth() {
        this.calculateWidth() を返します。
    }
    パブリック getHeight() {
        this.height を返します。
    }
}
ボタンを新規作成します。

console.log(button.getWidth()); // 600
console.log(button.width); // エラー TS2341: プロパティ 'width' はプライベートであり、クラス 'ButtonCreator' 内でのみアクセスできます。

要約:

JavaScript でプライベート メンバーを作成する方法についてはこれで終わりです。JavaScript でプライベート メンバーを作成する方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript のプライベート メンバーを調べる
  • プライベートメンバーの構文機能を実装する方法とJavaScriptに基づいてプライベートメンバーを実装する方法
  • JavaScript プライベート メンバー分析
  • JavaScript のプライベート メンバー

<<:  HTML 9グリッドレイアウトの実装方法

>>:  emとは?emとpxの紹介と変換方法

推薦する

MySQL パーティション テーブルの基本入門チュートリアル

序文最近のプロジェクトでは、大量のデータを保存する必要があり、このデータには有効期限があります。クエ...

nginx がアップストリーム アドレスにジャンプしない問題の解決方法

序文今日、nginx で非常に奇妙な問題に遭遇しました。フロントエンドの tomcat がページにジ...

VMware Tools を最初からインストールするための詳細な手順 (グラフィック チュートリアル)

VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...

開発環境にUbuntu 16をインストール後の初期設定

オフィスでは、Linux 開発環境として Ubuntu システムが必要です。現在、Ubuntu 16...

表に斜めヘッダー効果を出す5つの方法

誰もがテーブルをよく知っているはずです。コード内でよく見かけます。テーブルにスラッシュ ヘッダーを追...

ARMアーキテクチャにおける関数呼び出しプロセスの簡単な分析

目次1. 背景知識1. ARM64レジスタの紹介2. STP命令の詳しい説明(ARMV8マニュアル)...

HTML+CSSを使用してマウスの動きを追跡する

ユーザーがプライバシーを意識するようになり、オンライン トラッキングに対する予防策を強化するにつれて...

Ubuntu 18.04 に Anaconda3 をインストールするための詳細なチュートリアル

Anaconda は、conda、Python、およびそれらの依存関係など、180 を超える科学パッ...

MySQL のフィールドにデフォルトの時間を追加する方法

日付型の違いと用途MySQL には、日付、時刻、年、日付時刻、タイムスタンプの 5 つの日付タイプが...

Linux centos7 環境での MySQL インストール チュートリアル

Linux centos7 環境に MySQL をインストールする手順の詳細な紹介MySQLをインス...

Nginx 構成の実装 HTTPS セキュリティ認証

1. HttpとHttpsの違いHTTP: インターネットで最も広く使用されているネットワーク プロ...

Xshell を使用して VMware 上の Linux 仮想マシンに接続する (グラフィック手順)

はじめに: 最近 Hadoop プラットフォームの構築を勉強し始めたので、ローカルマシンに VMwa...

MySQL グループ化クエリと集計関数

概要私たちは、双十一に天猫で化粧品を購入する人の平均支出額を知りたい(商品の価格帯を見つけるのに役立...

Vue+echarts で積み上げ棒グラフを実現

この記事では、積み上げ棒グラフを実装するためのVue+echartsの具体的なコードを参考までに紹介...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...