亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
varキーワード
ES6変數(shù)の誕生
関數(shù)を使用します
モジュール設(shè)計(jì)モード
別の方法
ES6クラス
下線を使用します
すべてをコンストラクターに入れます
WeakMapを使用します
競(jìng)合を防ぐためにシンボルを使用します
TC39プライベートクラスフィールド提案
結(jié)論は
ホームページ ウェブフロントエンド CSSチュートリアル JavaScriptにプライベート変數(shù)を?qū)g裝します

JavaScriptにプライベート変數(shù)を?qū)g裝します

Apr 20, 2025 am 10:21 AM

JavaScriptにプライベート変數(shù)を?qū)g裝します

World Wide Webに力を與えるプログラミング言語であるJavaScriptは、1995年5月にBrendan Eichが作成して以來、広く使用された多用途のテクノロジーになりました。成功したにもかかわらず、かなりの批判、特にいくつかの機(jī)能も受けています。たとえば、オブジェクトはインデックスとして使用されると文字列にキャストされます。1== "1"はtrue、またはthisキーワードを混亂させる悪名高いものを返します。ただし、特に興味深い機(jī)能の1つは、さまざまなプライバシーを?qū)g裝するさまざまな手法の存在です。

現(xiàn)在、JavaScriptにプライベート変數(shù)を直接作成する方法はありません。他の言語では、 privateキーワードまたは二重アンダースコアを使用でき、すべてが正常に機(jī)能しますが、JavaScriptでは、可変プライバティネスには、予想される機(jī)能よりも言語の緊急機(jī)能により似た機(jī)能があります。最初に質(zhì)問の背景を紹介しましょう。

varキーワード

2015年まで、基本的に変數(shù)を作成する1つの方法しかありませんでしたが、それがvarキーワードでした。 varは関數(shù)スコープされています。つまり、このキーワードにインスタンス化された変數(shù)は、関數(shù)內(nèi)のコードによってのみアクセスできます。関數(shù)が外部または本質(zhì)的に「グローバル」である場(chǎng)合、変數(shù)が定義された後に実行されたすべてのものによって変數(shù)にアクセスできます。定義の前に同じスコープで変數(shù)にアクセスしようとすると、エラーの代わりにundefinedなります。これは、 varキーワードの「アップグレード」方法によるものです。

 //グローバル範(fàn)囲で「A」を定義します
var a = 123;

//関數(shù)範(fàn)囲で「B」を定義します
(関數(shù)() {
  console.log(b); // =>プロモーションにより、「未定義」がエラーではなく返されます。
  var b = 456;
})();

console.log(a); // => 123
console.log(b); //「b」に関數(shù)範(fàn)囲外からアクセスできないため、「參照エラー」例外をスローします。

ES6変數(shù)の誕生

2015年には、ES6/ES2015が公式にリリースされ、2つの新しい変數(shù)キーワードが続きました。Let const letどちらもブロックスコープされています。つまり、これらのキーワードで作成された変數(shù)は、同じブラケットのペア內(nèi)のすべてのものによってアクセスできます。 varと同じですが、 letおよびconst変數(shù)には、ループ、関數(shù)、ステートメント、ブラケットなどのブロックスコープの外側(cè)にアクセスできません。

 const a = 123;

//スコープの例#1をブロックします
if(true){
  const b = 345;
}

//スコープの例#2をブロックします
{
  const c = 678;
}

console.log(a); // 123
console.log(b); //「B」にブロックスコープの外側(cè)からアクセスできないため、「參照エラー」をスローします。
console.log(c); //「B」にブロックスコープの外側(cè)からアクセスできないため、「參照エラー」をスローします。

スコープの外側(cè)のコードは変數(shù)にアクセスできないため、プライベートの出現(xiàn)が得られます。さまざまな方法で実裝するためのいくつかの手法を紹介します。

関數(shù)を使用します

JavaScriptの関數(shù)もブロックであるため、すべての可変キーワードはそれらと連攜します。さらに、「モジュール」と呼ばれる非常に有用なデザインパターンを?qū)g裝できます。

モジュール設(shè)計(jì)モード

Googleは、「モジュール」を定義するためにオックスフォード辭書に依存しています。

このプログラムは、そこから構(gòu)築されるか、複雑な活動(dòng)のさまざまであるが相互に関連するユニットのいずれかを分析する場(chǎng)合があります。

- 「モジュール」定義1.2

モジュールの設(shè)計(jì)パターンは、パブリックコンポーネントとプライベートコンポーネントを組み合わせてプログラムをより小さなコンポーネントに分解できるため、JavaScriptで非常に役立ち、「カプセル化」と呼ばれるプロセスを通じて別のプログラムパーツがアクセスできるもののみを公開するためです。このようにして、私たちは使用する必要があるもののみを公開し、見る必要のないものを非表示にします。関數(shù)範(fàn)囲を活用することでこれを行うことができます。

 const carmodule =()=> {
  Milesdriven = 0とします。
  速度= 0とします。

  const Accelerate =(antom)=> {
    速度=額;
    milesdriven = speed;
  }

  const getMilesDriven =()=> MilesDriven;

  //「戻り」キーワードを使用して、どのコンテンツが公開され、どのコンテンツが非表示になっているかを制御できます。この場(chǎng)合、Accelerate()およびgetMilesdriven()関數(shù)のみを公開します。
  戻る {
    加速、
    getMilesDriven
  }
};

const testcarmodule = carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());

このようにして、走行距離と加速を取得できますが、この場(chǎng)合はユーザーがアクセス速度を必要としないため、 accelerate()getMilesDriven()メソッドのみを公開することで非表示にできます?;镜膜?、 speed同じ範(fàn)囲內(nèi)のコードによってのみアクセスできるため、プライベート変數(shù)です。この場(chǎng)合、プライベート変數(shù)の利點(diǎn)が明らかになり始めます。変數(shù)、関數(shù)、またはその他の內(nèi)部コンポーネントにアクセスする機(jī)能を削除すると、使用すべきではない他者が誤って他者が誤って使用している表面積を減らします。

別の方法

この2番目の例では、 thisキーワードの追加に気付くでしょう。 ES6矢印関數(shù)(=>)と従來の関數(shù)(){}には違いがあります。 functionキーワードを使用すると、 this使用できます。これは関數(shù)自體にバインドされ、矢印関數(shù)はthisキーワードのどのタイプの使用を許可しません。どちらもモジュールを作成するための同様に効果的な方法です。コアのアイデアは、アクセスする必要がある部品を開示し、対話するべきではない他の部品を保持することです。そのため、パブリックデータとプライベートデータの両方があります。

 function carmodule(){
  Milesdriven = 0とします。
  速度= 0とします。

  //この場(chǎng)合、代わりに「この」キーワードを使用します。
  // Carmoduleを指します
  this.Accelerate =(antom)=> {
    速度=額;
    milesdriven = speed;
  }

  this.getMilesDriven =()=> MilesDriven;
}

const testcarmodule = new Carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());

ES6クラス

クラスは、ES6のもう1つの新機(jī)能です。クラスは本質(zhì)的に構(gòu)文砂糖です。つまり、依然として機(jī)能ですが、より簡(jiǎn)単に表現(xiàn)された形に「美化」する場(chǎng)合があります。クラスの場(chǎng)合、コードにいくつかの大きな変更が加えられない限り、変動(dòng)的なプライベート(現(xiàn)在のところ)はほとんど不可能です。

クラスの例を見てみましょう。

クラスカーモジュール{
  /*
    Milesdriven = 0;
    速度= 0;
  */
  constructor(){
    this.milesdriven = 0;
    this.speed = 0;
  }
  加速(量){
    this.speed =額;
    this.milesdriven = this.speed;
  }
  getMilesDriven(){
    this.milesdrivenを返します。
  }
}

const testcarmodule = new Carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());

最初に注意すべきことは、 milesDrivenspeed変數(shù)がconstructor()関數(shù)にあることです。コンストラクターの外側(cè)の変數(shù)を定義することもできます(コードコメントに示されているように)が、とにかく機(jī)能的に同じです。問題は、これらの変數(shù)が公開され、クラス外の要素によってアクセスできることです。

この問題のいくつかの解決策を見てみましょう。

下線を使用します

協(xié)力者が壊滅的な間違いを犯さないようにするための狀況では、変數(shù)のプレフィックスとしてアンダースコア(_)を使用して、外側(cè)に「目に見える」が、開発者に「この変數(shù)に觸れないでください」を合図するのに十分です。したがって、たとえば、次のようになりました。

 //これはクラスの新しいコンストラクターです。コンストラクター()の外側(cè)の次のコンテンツとして表現(xiàn)できることに注意してください。
/*
  _milesdriven = 0;
  _Speed = 0;
*/
constructor(){
  this._milesdriven = 0;
  this._speed = 0;
}

これは特定のユースケースで機(jī)能しますが、多くの點(diǎn)で理想的ではないと言っても安全です。変數(shù)にアクセスすることもできますが、変數(shù)名を変更する必要もあります。

すべてをコンストラクターに入れます

技術(shù)的には、クラスでプライベート変數(shù)を使用する方法があります。これは、すべての変數(shù)とメソッドをconstructor()関數(shù)に配置することです。見てみましょう。

クラスカーモジュール{
  constructor(){
    Milesdriven = 0とします。
    速度= 0とします。

    this.Accelerate =(antom)=> {
      速度=額;
      milesdriven = speed;
    }

    this.getMilesDriven =()=> MilesDriven;
  }
}

const testcarmodule = new Carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());
console.log(testcarmodule.speed); //未定義 - 実際の変動(dòng)プライバシーがあります。

このアプローチは、意図的に開示されていない変數(shù)への直接アクセスがないため、真の変動(dòng)プライバシーを?qū)g裝します。問題は、私たちが今、私たちのものと比較して非常に良いコードを見ていないことであり、クラスを使用するときに構(gòu)文砂糖の利點(diǎn)を破ることです?,F(xiàn)時(shí)點(diǎn)では、 function()メソッドを使用することもできます。

WeakMapを使用します

また、 WeakMap()使用するためのプライベート変數(shù)を作成するためのより創(chuàng)造的な方法もあります。 Mapと同様に聞こえるかもしれませんが、2つは非常に異なります。マッピングはあらゆるタイプの値をキーとして取得できますが、 WeakMapオブジェクトのみを受け入れ、ガーベージがオブジェクトキーを収集するときにWeakMapの値を削除します。さらに、 WeakMap反復(fù)することはできません。つまり、値にアクセスするにはオブジェクトキーへの參照にアクセスする必要があります。これにより、変數(shù)は実際には見えないため、プライベート変數(shù)の作成に非常に役立ちます。

クラスカーモジュール{
  constructor(){
    this.data = new weakMap();
    this.data.set(this、{
      マイルズドライブン:0、
      速度:0
    });
    this.getMilesdriven =()=> this.data.get(this).Milesdriven;
  }

  加速(量){
    //このバージョンでは、代わりにWeakMapを作成し、//「この」キーワードをキーとして使用します。
    const data = this.data.get(this);
    const速度= data.speed額;
    const milesdriven = data.milesdriven data.speed;
    this.data.set({speed、milesdriven});
  }

}

const testcarmodule = new Carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());
console.log(testcarmodule.data); // => weakmap {[items nown nowns]}  - このデータは、外部から簡(jiǎn)単にアクセスできません!

このソリューションは、データの偶発的な使用を防ぐのに適していますが、 this CarModuleに置き換えることで外部からアクセスできるため、実際にはプライベートではありません。さらに、それはかなりの複雑さを追加するため、最もエレガントなソリューションではありません。

競(jìng)合を防ぐためにシンボルを使用します

目的が名前の競(jìng)合を防ぐことである場(chǎng)合、 Symbolを使用して有用なソリューションを提供できます。これらは本質(zhì)的に一意の値として機(jī)能する可能性のあるインスタンスであり、獨(dú)自のインスタンスを除いて他の値に匹敵することはありません。実際のアプリケーションの例は次のとおりです。

クラスカーモジュール{
  constructor(){
    this.speedKey = symbol( "speedkey");
    this.milesdrivenkey = symbol( "milesdrivenkey");
    この[this.speedkey] = 0;
    この[this.milesdrivenkey] = 0;
  }

  加速(量){
    //このデータは、予期せずにアクセスすることはほとんど不可能です。決してプライベートではありません。
    //しかし、このモジュールを?qū)g裝する人から離れています。
    この[this.speedKey] =額;
    この[this.milesdrivenkey] = this [this.speedkey];
  }

  getMilesDriven(){
    これを返します[this.milesdrivenkey];
  }
}

const testcarmodule = new Carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());
console.log(testcarmodule.speed); // =>未定義 - 変數(shù)にアクセスするには、內(nèi)部キーにアクセスする必要があります。

アンダースコアソリューションと同様に、このアプローチは、混亂を防ぐために義務(wù)の命名に多かれ少なかれ依存しています。

TC39プライベートクラスフィールド提案

最近、クラスに私的変數(shù)を?qū)毪工胄陇筏ぬ岚袱岚袱丹欷蓼筏?。?jiǎn)単です:変數(shù)名を準(zhǔn)備し、プライベートになります。追加の構(gòu)造変更は必要ありません。

クラスカーモジュール{
  #Speed = 0
  #milesdriven = 0

  加速(量){
    //このデータは、予期せずにアクセスすることはほとんど不可能です。
    これ。#speed =額;
    これ。#milesdriven = speed;
  }

  getMilesDriven(){
    これを返してください。#milesdriven;
  }
}

const testcarmodule = new Carmodule();
testcarmodule.accelerate(5);
testcarmodule.accelerate(4);
console.log(testcarmodule.getMilesdriven());
console.log(testcarmodule.speed); // =>未定義 - 変數(shù)にアクセスするには、內(nèi)部キーにアクセスする必要があります。

プライベートクラスの機(jī)能は現(xiàn)実になり、非常に優(yōu)れたブラウザのサポートがあります。

結(jié)論は

これは、JavaScriptにプライベート変數(shù)を?qū)g裝するさまざまな方法の要約です。 「正しい」アプローチはありません。これらの方法は、さまざまな要件、既存のコードベース、およびその他の制約に適しています。それぞれのアプローチには利點(diǎn)と短所がありますが、最終的には、問題を効果的に解決する限り、すべてのアプローチは等しく効果的です。

読んでくれてありがとう!これにより、JavaScriptコードを改善するためにスコープと変動(dòng)するプライバシーを適用する方法に関する洞察が得られることを願(yuàn)っています。これは、多くの異なる方法をサポートし、コードを使いやすくエラーできない強(qiáng)力なテクノロジーです。より良い気持ちを得るために、自分でいくつかの新しい例を試してください。

以上がJavaScriptにプライベート変數(shù)を?qū)g裝しますの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國(guó)語版

SublimeText3 中國(guó)語版

中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ロードスピナーとアニメーションを作成するためのCSSチュートリアル ロードスピナーとアニメーションを作成するためのCSSチュートリアル Jul 07, 2025 am 12:07 AM

CSSロード回転子を作成するには3つの方法があります。1。境界の基本回転子を使用して、HTMLとCSSを介してシンプルなアニメーションを?qū)g現(xiàn)します。 2。複數(shù)のポイントのカスタム回転子を使用して、異なる遅延時(shí)間を経てジャンプ効果を?qū)g現(xiàn)します。 3.ボタンに回転子を追加し、JavaScriptを介してクラスを切り替えて、読み込みステータスを表示します。各アプローチは、ユーザーエクスペリエンスを向上させるために、色、サイズ、アクセシビリティ、パフォーマンスの最適化などのデザインの詳細(xì)の重要性を強(qiáng)調(diào)しています。

CSSブラウザの互換性の問題とプレフィックスに対処します CSSブラウザの互換性の問題とプレフィックスに対処します Jul 07, 2025 am 01:44 AM

CSSブラウザの互換性とプレフィックスの問題に対処するには、ブラウザサポートの違いを理解し、ベンダーのプレフィックスを合理的に使用する必要があります。 1. FlexBoxやグリッドのサポート、位置:粘著性の無効、アニメーションのパフォーマンスなどの一般的な問題を理解することは異なります。 2. CANIUSE確認(rèn)機(jī)能サポートステータスを確認(rèn)します。 3. -webkit-、-moz-、-ms-、-o-およびその他のメーカーのプレフィックスを正しく使用します。 4.自動(dòng)的にプレフィックスを追加するためにAutoprefixerを使用することをお?jiǎng)幛幛筏蓼埂?5. PostCSSをインストールし、ターゲットブラウザを指定するようにBrowserSlistを構(gòu)成します。 6.建設(shè)中の互換性を自動(dòng)的に処理します。 7. Modernizr検出機(jī)能は、古いプロジェクトに使用できます。 8.すべてのブラウザの一貫性を追求する必要はありません、

ディスプレイの違いは何ですか:インライン、ディスプレイ:ブロック、ディスプレイ:インラインブロック? ディスプレイの違いは何ですか:インライン、ディスプレイ:ブロック、ディスプレイ:インラインブロック? Jul 11, 2025 am 03:25 AM

Themaindifferencesbetweendisplay:インライン、ブロック、およびinline-blockinhtml/cssarelayoutbehavior、spaceusage、andstylingcontrol.1.inlineelementsflowwithtext、notstartonnewlines、nagrorewidth/height、height、andonlyhorizo??ntalpadddddddddddddddding

スタイリングは、CSSとは異なるリンクを訪問しました スタイリングは、CSSとは異なるリンクを訪問しました Jul 11, 2025 am 03:26 AM

アクセスしたリンクのスタイルを設(shè)定すると、特にコンテンツ集約型のWebサイトでユーザーエクスペリエンスを向上させることができ、ユーザーがより良いナビゲートを支援します。 1。CSSを使用してください:訪問した擬似クラスは、色の変化などの訪問されたリンクのスタイルを定義します。 2。ブラウザは、プライバシーの制限により、いくつかの屬性の変更のみを許可することに注意してください。 3.突然の狀態(tài)を避けるために、色の選択は全體的なスタイルと調(diào)整する必要があります。 4.モバイル端子はこの効果を表示しない場(chǎng)合があり、アイコン補(bǔ)助ロゴなどの他の視覚的なプロンプトと組み合わせることをお?jiǎng)幛幛筏蓼埂?/p>

CSSクリップパスでカスタムシェイプを作成します CSSクリップパスでカスタムシェイプを作成します Jul 09, 2025 am 01:29 AM

CSSのクリップパス屬性を作物要素に使用して、寫真やSVGに依存することなく、三角形、円形ノッチ、ポリゴンなどのカスタム形狀になります。その利點(diǎn)には、次のものが含まれます。1。円、楕円、ポリゴンなどのさまざまな基本的な形狀をサポートします。 2。レスポンシブ調(diào)整とモバイル端子に適応可能。 3.アニメーションが簡(jiǎn)単で、HoverまたはJavaScriptと組み合わせて動(dòng)的効果を?qū)g現(xiàn)できます。 4.レイアウトフローには影響せず、ディスプレイエリアのみを収穫します。一般的な使用法は、円形のクリップパス:円(50pxatcenter)および三角クリップパス:ポリゴン(50%0%、100 0%、0 0%)などです。知らせ

CSSペイントAPIとは何ですか? CSSペイントAPIとは何ですか? Jul 04, 2025 am 02:16 AM

thecsspaintingapienablesdynamicimagegeneration incssusingjavascript.1.developerscreateapaintclasswithapaint()method.2.they registeritviaregisterpaint()

CSSを使用して応答性のある畫像を作成する方法は? CSSを使用して応答性のある畫像を作成する方法は? Jul 15, 2025 am 01:10 AM

CSSを使用してレスポンシブ畫像を作成するには、主に次の方法で達(dá)成できます。1。最大幅を使用してください:100%と高さ:自動(dòng)化して、割合を維持しながら畫像がコンテナ幅に適応できるようにします。 2。HTMLのSRCSETおよびサイズの屬性を使用して、異なる畫面に適合した畫像ソースをインテリジェントにロードします。 3.オブジェクトフィットとオブジェクトポジションを使用して、畫像のトリミングとフォーカスディスプレイを制御します。一緒に、これらの方法により、畫像がさまざまなデバイスで明確かつ美しく表示されるようになります。

一般的なCSSブラウザの矛盾とは何ですか? 一般的なCSSブラウザの矛盾とは何ですか? Jul 26, 2025 am 07:04 AM

さまざまなブラウザのCSS解析に違いがあるため、主にデフォルトのスタイルの違い、ボックスモデルの計(jì)算方法、フレックスボックスおよびグリッドレイアウトサポートレベル、および特定のCSS屬性の一貫性のない動(dòng)作を含む一貫性のないディスプレイ効果が得られます。 1.デフォルトのスタイル処理は一貫性がありません。解決策は、cssresetまたはremormize.cssを使用して初期スタイルを統(tǒng)合することです。 2。IEの古いバージョンのボックスモデル計(jì)算方法は異なります。 Box-Sizing:Border-Boxを統(tǒng)一された方法で使用することをお?jiǎng)幛幛筏蓼埂?3. FlexBoxとグリッドは、エッジの場(chǎng)合や古いバージョンでは異なる機(jī)能を示します。より多くのテストを行い、Autoprefixerを使用します。 4.一部のCSS屬性の動(dòng)作は一貫性がありません。 Caniuseは相談して格下げする必要があります。

See all articles