JavaScript のプライベート クラス フィールドと TypeScript のプライベート修飾子の詳細な説明

JavaScript のプライベート クラス フィールドと TypeScript のプライベート修飾子の詳細な説明

JavaScript のプライベート クラス フィールドとプライバシーの必要性

これまで、JavaScript には、もちろん従来のクロージャを除いて、変数へのアクセスを保護するネイティブ メカニズムはありませんでした。

クロージャは、人気のあるモジュール パターンなど、JavaScript における多くのプライバシーに似たパターンの基礎となります。しかし、近年の ECMAScript 2015 クラスの使用により、開発者はクラス メンバーのプライバシーをより厳密に制御する必要性を感じるようになりました。

クラス フィールドの提案 (執筆時点ではステージ 3) では、プライベート クラス フィールドを導入することでこの問題を解決しようとしています。

どのような見た目か見てみましょう。

JavaScript プライベートクラスフィールドの例

以下はプライベート フィールドを持つ JavaScript クラスです。「パブリック」メンバーとは異なり、各プライベート フィールドはアクセスする前に宣言する必要があることに注意してください。

クラス Person {
  #年;
  #名前;
  #姓;
  コンストラクタ(名前、姓、年齢) {
    this.#name = 名前;
    this.#surname = 姓;
    this.#age = 年齢;
  }
  フルネームを取得する() {
    `${this.#name} + ${this.#surname}` を返します。
  }
}

プライベート クラス フィールドはクラス外部からアクセスできません。

クラス Person {
  #年;
  #名前;
  #姓;
  コンストラクタ(名前、姓、年齢) {
    this.#name = 名前;
    this.#surname = 姓;
    this.#age = 年齢;
  }
  フルネームを取得する() {
    `${this.#name} + ${this.#surname}` を返します。
  }
}
const marta = new Person("Marta", "Cantrell", 33);
console.log(marta.#age); // 構文エラー

これが本当の「プライバシー」です。 TypeScript について少しでも知っている場合は、「ネイティブ」プライベート フィールドと TypeScript の private 修飾子の共通点は何なのか疑問に思うかもしれません。

答えは「いいえ」です。しかし、なぜ?

TypeScriptのprivate修飾子

従来のプログラミング言語の経験がある開発者は、TypeScript の private 修飾子に精通している必要があります。つまり、このキーワードの目的は、クラス外からのクラス メンバーへのアクセスを拒否することです。

ただし、TypeScript は JavaScript の上のレイヤーであり、TypeScript コンパイラーは private を含むすべての派手な TypeScript コメントを削除する必要があることを忘れないでください。

つまり、次のクラスは必要な動作を実行しません。

クラス Person {
  プライベート年齢:番号;
  プライベート名: 文字列;
  個人の姓: 文字列;
  コンストラクター(名前: 文字列、姓: 文字列、年齢: 数値) {
    this.name = 名前;
    this.surname = 姓;
    this.age = 年齢;
  }
  フルネームを取得する() {
    `${this.name} + ${this.surname}` を返します。
  }
}
const liz = new Person("Liz", "Cantrill", 31);
// @ts を無視
コンソールにログ出力します。

//@ts-ignore がない場合、 liz.age にアクセスすると TypeScript でエラーが発生するだけですが、コンパイル後には次の JavaScript コードが生成されます。

「厳密な使用」;
var Person = /** @class */ (function () {
    関数 Person(名前, 姓, 年齢) {
        this.name = 名前;
        this.surname = 姓;
        this.age = 年齢;
    }
    Person.prototype.getFullName = 関数 () {
        this.name + " + " + this.surname を返します。
    };
    Person を返します。
}());
var liz = new Person("Liz", "Cantrill", 31);
console.log(liz.age); // 31

予想どおり、liz.age をコンソールに出力できます。ここでの重要な点は、TypeScript の private はそれほどプライベートではなく、TypeScript レベルでは便利に感じられるだけで、「本当のプライバシー」ではないということです。

それでは、TypeScript の「ネイティブ」プライベート クラス フィールドに移りましょう。

TypeScript のプライベート クラス フィールド

TypeScript 3.8 では ECMAScript のプライベート フィールドがサポートされますが、TypeScript のプライベート修飾子と混同しないでください。

以下は TypeScript のプライベート クラス フィールドを持つクラスです。

クラス Person {
    #年齢: 数字;
    #名前: 文字列;
    #姓: 文字列;
    コンストラクター(名前:文字列、姓:文字列、年齢:数値) {
        this.#name = 名前;
        this.#surname = 姓;
        this.#age = 年齢;
    }
    フルネームを取得する() {
        `${this.#name} + ${this.#surname}` を返します。
    }
}

型注釈を除けば、ネイティブ JavaScript と違いはありません。メンバーには外部からアクセスできません。しかし、TypeScript のプライベート フィールドの本当の問題は、内部的に WeakMap が使用されていることです。

このコードをコンパイルするには、tsconfig.json でターゲット コンパイル バージョンを調整する必要があります。これは少なくとも ECMAScript 2015 である必要があります。

{
  "コンパイラオプション": {
    "ターゲット": "es2015",
    "厳密": 真、
    "lib": ["dom","es2015"]
  }
}

これは、対象ブラウザによっては問題になる可能性があり、WeakMap のポリフィルを提供する予定がない限り、新しい凝った構文を書くだけでも大変な作業になります。

JavaScript では、新しい構文を使用したい一方で、多くのポリフィルでユーザー エクスペリエンスを低下させたくないという緊張関係が常に存在します。

一方、新しいブラウザにリリースする場合でも、プライベート クラス フィールドについて心配する必要はありません。少なくとも今はそうです。 Firefox でさえこの提案を実装していません。

以上がJavaScriptのプライベートクラスフィールドとTypeScriptのプライベート修飾子の詳しい説明です。JavaScriptのプライベートクラスフィールドとTypeScriptのプライベート修飾子の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JavaScriptとTypeScriptの関係
  • JS デコレータ パターンと TypeScript デコレータ
  • MD5ハッシュを取得する際のPythonとJSの違いは何ですか
  • Easy Languageでjsを使用してmd5暗号化を実装する方法の詳細な説明
  • TypeScript および JavaScript プロジェクトに MD5 チェックサムを導入する

<<:  win10でのmysql5.7.21解凍バージョンのインストールチュートリアル

>>:  Linuxで静的ネットワーク接続を構成する方法

推薦する

CSS で点線の境界線のスクロール効果を実装するサンプルコード

マウスをある領域の上に置くと、その領域に点線の境界線と線のアニメーションが表示されるというクールな効...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

Linux 論理ボリューム管理 (LVM) の使用法の概要

ディスク領域の管理は、システム管理者にとって重要な日常的なタスクです。ディスク領域が使い果たされると...

ドロップダウンメニューを実現するためのHTML+CSS

1. ドロップダウンリストの例コードは次のとおりです。 <!doctypehtml> ...

MySQL デュアルマシン ホットスタンバイ実装ソリューション [テスト可能]

目次1. コンセプト2. 環境の説明3. マスタースレーブホットスタンバイ実装1. コンセプト1. ...

MySQL ステートメントを使用した簡単な追加、削除、変更、クエリ操作の例

この記事では、例を使用して、MySQL ステートメントを使用して、単純な追加、削除、変更、およびクエ...

jQueryは画像の強調表示を実現します

ページ上の画像を強調表示することは非常に一般的です。ここでは、jQuery を使用して画像を強調表示...

Linux で履歴コマンドを表示および実行する方法

履歴コマンドを表示し、指定されたコマンドを実行します owen@owen:~/owen/softwa...

Vue カスタム箇条書きボックス効果 (確認ボックス、プロンプトボックス)

この記事の例では、参考のためにVueカスタムポップアップ効果の具体的なコードを共有しています。具体的...

Dockerコンテナを停止または強制終了できない問題の解決策

Docker バージョン 1.13.1問題プロセス特定の環境のMySQLコンテナを停止、強制終了、ま...

MySQLクエリ最適化プロセスを理解する

目次パーサーとプリプロセッサクエリオプティマイザーMySQL クエリの最適化には、解析、前処理、最適...

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...

MySQL 高可用性クラスタの展開とフェイルオーバーの実装

目次1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルド...

mysql-8.0.16 winx64 最新インストール チュートリアル (画像とテキスト付き)

最近、データベースについて学び始めました。最初にやったことは、データベースとは何か、データベースとデ...

JavaScript の async と await のシンプルで詳細な学習

目次1. はじめに2. 詳しい説明2.1、非同期2.1.1. 関数はPromise以外のオブジェクト...