JavaScript のプライベート/静的プロパティの概要_javascript ヒント
•ブロックレベルのスコープをシミュレートする
JavaScript にはブロックレベルのスコープの概念がないことは誰もが知っています。次の例を参照してください。
(function () {
for (var i = 0; i //何もしない
}
alert(i) //出力 10
})();
行 6 は、ループ ブロック内の変数 i で、上記のコードを少し変更して for ループ ブロックをクロージャ内に配置すると、状況は異なります。
(function () {
(function () {
for (var i = 0; i //何もしない
}
})();
alert(i) //エラー: 'i' が未定義です
})(); >
8 行目の変更された i にアクセスすると、エラーが発生し、必要なブロックレベルのスコープが達成されました。
JavaScriptにはブロックレベルのスコープの概念はなく、プライベートプロパティの概念もありませんが、プライベート変数は存在します。一部のデータをカプセル化して非表示にしたい場合はどうすればよいでしょうか?クロージャとプライベート変数を使用してオブジェクトのプライベート プロパティを実装できると考えたことがあるかもしれません。
. インスタンスのプライベート属性
インスタンスのプライベート属性の特徴は、各オブジェクトに独立した属性が含まれ、オブジェクト間で共有がないことです。この目標を達成するには、他の OO 言語のセッターとゲッターと同様に、コンストラクターにプライベート変数を追加し、このプライベート変数にアクセスするパブリック メソッドを定義します。次の例では、インスタンスのプライベート プロパティを実装します。
//プライベート変数を定義します
//注意: this.name を使用すると、パブリック プロパティ
var privateName = name; になります。 >//プライベート ファミリアリティを定義します
var privateFunction = function () {
return "プライベート関数";
}
//パブリック メソッド アクセス プライベート ファミリアリティ
MyObject.prototype.getName = function ( ) {
return privateName;
}
MyObject.prototype.getFunction = function () {
return privateFunction();
}
}
var moGyy = new MyObject( "gyy");
alert (moGyy.getName()); // 出力 gyy
alert(moGyy.getFunction()); // 出力プライベート関数
var moCyy = new MyObject("cyy") );
alert(moCyy. getName()); // cyy を出力します。
alert(moCyy.getFunction()); // 2 つのオブジェクトのプライベート関数
を出力します。と 上記の例で作成された moCyy は異なる値を返します。プライベート メソッドを呼び出したい場合は、パブリック インターフェイスも必要です。上記の例で、2 つのパブリック関数がプライベート変数にアクセスできるのは、2 つのパブリック関数がクロージャであり、クロージャのスコープ チェーンにその関数を含む変数オブジェクトが含まれているためです。したがって、変数を検索するときは A スコープが使用されます。チェーンを使用すると、それを含む関数内のプライベート変数にアクセスできます。上記の例では、オブジェクトが作成されるたびに同じ機能を持つ 2 つの関数インスタンスが作成されるのを防ぐために、パブリック メソッドが MyObject のプロトタイプに追加されています。
<2>. 静的プライベート属性
//静的プライベート変数とインスタンスプライベート変数
(function () {
//プライベート変数を定義します
var staticPrivateValue = "";
//コンストラクター、コンストラクターweaving function to a global variable
MyObject = function (name) {
//インスタンス変数を定義します
this.name = name
}//プライベートにアクセスするための 2 つのパブリック メソッドを定義します。変数をプロトタイプに再度追加します。
MyObject.prototype.getPrivateValue = function () {
return staticPrivateValue;
}
MyObject.prototype.setPrivateValue = function (value ) {
staticPrivateValue = 値;
}
})();
var mo = new MyObject("jeff-gyy");
mo.setPrivateValue("gyycyy"); private 属性
alert(mo.getPrivateValue()); // 出力 gyycyy
alert(mo.name); // 出力 jeff-gyy
var mo1 = new MyObject("jeff- cyy");
alert(mo1.getPrivateValue()); //gyycyy を出力
alert(mo1.name); //jeff-cyy を出力
. モジュール モードと拡張モジュール モード
データをグローバルに共有するもう 1 つの方法は、モジュール モードを使用してオブジェクト タイプのシングルトン モードを実装することも、拡張モジュール モードを使用することもできます。次の例に示すように、タイプのシングルトン パターンを実装します。
//プライベート変数
var privateValue = ""
//通常のモジュール モード
; return {
publicValue: "public ",
//プライベート変数にアクセスします
getPrivateValue: function () {
return privateValue;
},
setPrivateValue: function (value) {
privateValue = 値;
}
}();
mo.setPrivateValue("プライベート値");
alert(mo.getPrivateValue()); (mo.publicFunction());
モジュール モードは、匿名関数を使用して内部実装をカプセル化します。この例では、返されたオブジェクトにプライベート変数 privateValue が含まれています。クロージャのスコープ チェーンを介して含まれる関数にアクセスします。定義された匿名関数はすぐに呼び出されるため、変数 mo は返されたオブジェクトを参照します。上記のシングルトン パターンは、Object オブジェクトを返します。拡張モジュール パターンを使用して、カスタム タイプのシングルトン パターンを実装できます。 > コードは次のとおりです:
//カスタム コンストラクター
function MyObject(name) {
return privateValue; o.setPrivateValue = 関数 (値) {
privateValue = 値;
return o;
mo.setPrivateValue("プライベート値"); (mo.getPrivateValue());
alert(mo.publicFunction());
上記のコード例は、MyObject のシングルトン モードを実装しています。
最後に言及する必要があるのは、クロージャの使用には利点と欠点があるということです。クロージャのスコープ チェーンは関数を含む変数オブジェクトを参照するため、追加のメモリを占有し、変数の検索も必要になります。スコープチェーンを介して実行されるため、検索時間が消費され、クロージャが深くなるほど状況はより深刻になります。さらに、IE (以前のバージョン) では、ガベージ コレクション メカニズムで参照カウントが使用されるため、次の例に示すように、循環参照が発生してメモリ リークが発生する可能性があります:
コードをコピーします
コードは次のとおりです。
function assignHandler(){
var element = document.getElementById("someElement"); element.onclick = function( ){
alert(element.id)
}
;
上記のコードでは、要素のイベントとしてクロージャが作成されています。クロージャは、関数 assingHandler を含む変数オブジェクトへの参照であるため、要素の参照カウントが 1 になります。リサイクルされないため、メモリ リークが発生します。それを修正する方法を考えることができます。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

JavaScriptはPowerPointで実行でき、外部JavaScriptファイルを呼び出したり、VBAを介してHTMLファイルを埋め込んだりすることで実装できます。 1. VBAを使用してJavaScriptファイルを呼び出すには、マクロを有効にし、VBAプログラミングの知識を持つ必要があります。 2。JavaScriptを含むHTMLファイルを埋め込みます。これは、シンプルで使いやすいが、セキュリティ制限の対象となります。利点には、拡張機能と柔軟性が含まれますが、欠点にはセキュリティ、互換性、複雑さが含まれます。実際には、セキュリティ、互換性、パフォーマンス、ユーザーエクスペリエンスに注意を払う必要があります。
