ホームページ >ウェブフロントエンド >フロントエンドQ&A >JavaScript ではプライベート メソッドが定義されていますか?
JavaScript は、データやメソッドを隠すためのいくつかのカプセル化メソッドを提供するオブジェクト指向プログラミング言語です。 JS では、関数とオブジェクトを使用してカプセル化を実現できます。一般的に使用されるカプセル化方法は、クロージャまたはコンストラクタを使用することです。ただし、カプセル化は一部のプロパティまたはメソッドをプライベート化するだけであり、真にプライベート化するわけではありません。
JavaScript には、正式なプライベート メソッドはありません。ただし、いくつかのトリックを使用してプライベート メソッドをシミュレートし、データ保護とカプセル化を実現できます。
プライベート メソッドをシミュレートする一般的な方法は、クロージャを使用することです。関数内にいくつかのローカル変数と関数を定義できます。これらの変数と関数はクロージャを形成し、関数内の変数とパラメータにアクセスできます (親スコープ)。外部からこれらの変数や関数に直接アクセスすることはできないため、プライベート性をシミュレートするという目的は達成されます。
たとえば、パブリック メソッドとプライベート メソッドを持つオブジェクトを定義したいとします。ここで、プライベート メソッドはオブジェクト内でのみ使用できます。これを実現するにはクロージャを使用します。
function MyObject() { this.publicMethod = function() { console.log('This is a public method.'); privateMethod(); }; var privateMethod = function() { console.log('This is a private method.'); }; }
この例では、privateMethod
変数はコンストラクター内で定義されているため、コンストラクター内のパブリック メソッドによってのみアクセスできます。 「偽の」プライベート メソッドの影響。
「偽の」プライベート メソッドを実装するもう 1 つの一般的な方法は、命名規則を使用することです。メソッド名を # で始めることにより、メソッドがプライベートであり、オブジェクトの外部から呼び出すべきではないことを示します。もちろん、JavaScript では引き続きオブジェクトのプロパティとメソッドを直接呼び出すことができるため、このアプローチでは実際にはメソッドが保護されません。
ECMAScript 6 では、シンボル タイプのプロパティを使用してプライベート メソッドを作成できます。シンボルは、オブジェクトのプロパティの作成に使用できる新しい基本データ型です。 Symbol 型のプロパティは一意であるため、これを使用してプライベート メソッドを作成し、メソッド名の競合の問題が発生しないようにすることができます。たとえば、次のようなオブジェクトを定義できます。
const PRIVATE_METHOD = Symbol(); class MyClass { constructor() { this[PRIVATE_METHOD] = function() { console.log('This is a private method.'); }; } publicMethod() { console.log('This is a public method.'); this[PRIVATE_METHOD](); } } let object = new MyClass(); object.publicMethod(); // 输出 "This is a public method." 和 "This is a private method." object[PRIVATE_METHOD](); // 抛出TypeError异常,因为该方法是私有的
この例では、Symbol type 属性を使用してプライベート メソッドをプライベート化し、オブジェクトの外部からプライベート メソッドにアクセスできないようにします。
つまり、JavaScript には直接的なプライベート メソッドはありませんが、クロージャ、命名規則、またはシンボル型属性を使用して、プライベート メソッドの機能を間接的に実装できます。実際の開発では、特定の状況に応じてデータのカプセル化を実装するための最も適切な方法を選択する必要があります。
以上がJavaScript ではプライベート メソッドが定義されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。