同時に、高級オブジェクト指向言語では、プライベート メンバーを含むオブジェクトの作成が最も基本的な機能の 1 つであり、プライベート メンバーにアクセスするためのプロパティとメソッドを提供することで内部の詳細が隠蔽されることもわかっています。 JS もオブジェクト指向ですが、メンバーがパブリックかプライベートかを直接示す内部メカニズムはありません。繰り返しますが、JS の言語の柔軟性を利用して、パブリック、プライベート、および特権メンバーを作成できます。情報の隠蔽が私たちが達成したい目標であり、カプセル化はこの目標を達成する方法です。例で説明しましょう。書籍データを保存し、そのデータを Web ページに表示するクラスを作成します。
1. 最も簡単なのは、オブジェクトを完全に公開することです。コンストラクターを使用して、すべてのプロパティとメソッドが外部からアクセスできるクラスを作成します。
var Book = function(isbn, title,著者) {
if(isbn == unknown) {
throw new Error("Book コンストラクターには isbn が必要です。")
}
this.isbn =
this.title; = タイトル | "";
this.author = 著者 ""
Book.prototype.display = function() {
return "書籍: " ",Title : " this.title ",Author: " this.author;
}
if(!this.checkIsbn(isbn)) {
throw new Error("書籍: ISBN が無効です。")
}
this.isbn =
this; .title = タイトル || "";
this.author = 著者 || ""
book.prototype = {
checkIsbn: function(isbn) == 未定義 || isbn のタイプ != "string") return false;
isbn = isbn.replace("-", ""); 13) false を返します;
var sum == 10) {
if(!isbn.match(^d{9}))
を返します。 (var i = 0;i sum = isn.charAt(i) * (10 - i)
}
var checksum = sum % 11; (チェックサム = = 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) return false;
} else {
if(!isbn.match(^d{12) })) false を返します;
for(var i = 0;i sum =isbn.charAt(i) * (i % 2 == 0 ? 1 : 3); 🎜>}
var checksum = sum % 10;
if(isbn.charAt(12) != checksum) return false;
}
return
},
display; : function( ) {
return "書籍: ISBN: " this.isbn ",タイトル: " this.title ",著者: " this.author;
;
ISBN の有効性を検証し、display() が正常に動作できることを確認するために checkIsbn() を追加しました。ただし、要件は変更されており、各書籍に複数のバージョンがある可能性があります。つまり、同じ書籍に複数の ISBN 番号がある可能性があり、制御のためにバージョンを選択するための別のアルゴリズムを維持する必要があります。同時に、データの整合性はチェックできますが、内部メンバーへの外部アクセスを制御できないため(isbn、タイトル、著者に値を割り当てるなど)、内部データを保護する方法はありません。私たちはこのソリューションを改善し続け、インターフェイス実装 (get アクセサー/セット メモリを提供する) を採用します。
コードをコピー
var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "checkIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]) ;
var Book = function(isbn, title, author) {
// Publication インターフェイスを実装します
this.setIsbn(isbn);
this.setTitle(タイトル);
this.setAuthor(著者);
}
Book.prototype = {
getIsbn: function() {
return this.isbn;
},
setIsbn: function(isbn) {
if(!this.checkIsbn(isbn)) {
throw new Error("書籍: 無効な ISBN。");
}
this.isbn = isb;
},
checkIsbn: function(isbn) {
if(isbn == 未定義 || typeof isbn != "string") return false;
isbn = isbn.replace("-", "");
if(isbn.length != 10 &&isbn.length != 13) は false を返します。
変数合計 = 0;
if(isbn.length == 10) {
if(!isbn.match(^d{9})) false を返します。
for(var i = 0;i sum =isbn.charAt(i) * (10 - i);
}
var checksum = sum % 11;
if(チェックサム == 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) false を返します。
} else {
if(!isbn.match(^d{12})) return false;
for(var i = 0;i sum = isbn.charAt(i) * (i % 2 == 0 ? 1 : 3);
}
var checksum = sum % 10;
if(isbn.charAt(12) != チェックサム) false を返します。
}
true を返します。
},
getTitle: function() {
return this.title;
},
setTitle: function(title) {
this.title = title || "";
},
getAuthor: function() {
return this.author;
},
setAuthor: function(author) {
this.author = 著者 || "";
},
display: function() {
return "書籍: ISBN: " this.isbn ",タイトル: " this.title ",著者: " this.author;
}
};
この方法は、同様のテストを 2 回実行する必要がなく、完全な完全なエクスポーズ オブジェクト スキームと同様に、アーキテクチャの内部でも実行されます。この方法は、メモリを設定することによって設定することができるが、公開されており、値を直接評価することもできる。
2. 唯一の欠点は、内部データを保護できず、余分なコードが追加されることです。 命名規則の私的方法を使用する。つまり、下位ラインを使用して私が所有者であることを認識し、私が所有者に評価値を適用することを回避し、本質的には完全な暴露対象を回避する。
var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "getTitle" 、「setTitle」、「getAuthor」、「setAuthor」、「display」]);
var Book = function(isbn, title, author) {
// Publication インターフェイスを実装します
this.setIsbn(isbn);
this.setTitle(タイトル);
this.setAuthor(著者);
}
Book.prototype = {
getIsbn: function() {
return this._isbn;
},
setIsbn: function(isbn) {
if(!this._checkIsbn(isbn)) {
throw new Error("書籍: 無効な ISBN。");
}
this._isbn = isbn;
},
_checkIsbn: function(isbn) {
if(isbn == 未定義 || typeof isbn != "string") return false;
isbn = isbn.replace("-", "");
if(isbn.length != 10 &&isbn.length != 13) は false を返します。
変数合計 = 0;
if(isbn.length == 10) {
if(!isbn.match(^d{9})) return false;
for(var i = 0;i sum =isbn.charAt(i) * (10 - i);
}
var checksum = sum % 11;
if(チェックサム == 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) false を返します。
} else {
if(!isbn.match(^d{12})) return false;
for(var i = 0;i sum = isbn.charAt(i) * (i % 2 == 0 ? 1 : 3);
}
var checksum = sum % 10;
if(isbn.charAt(12) != チェックサム) false を返します。
}
true を返します。
},
getTitle: function() {
return this._title;
},
setTitle: function(title) {
this._title = title || "";
},
getAuthor: function() {
return this._author;
},
setAuthor: function(author) {
this._author = 著者 || "";
},
display: function() {
return "書籍: ISBN: " this.getIsbn() ",タイトル: " this.getTitle() ",著者: " this.getAuthor();
}
};
注: 「_」でプライベート メンバーとしてマークされるisbn、title、author属性に加えて、checkIsbn() もプライベート メソッドとしてマークされます。
3. クロージャを通じてメンバーを本当に私物化する。クロージャの概念におけるスコープとネストされた関数に詳しくない場合は、ここでは詳しく説明しませんが、記事「オブジェクト指向 Javascript の 1 つ (初めての Javascript 入門)」を参照してください。
var Publication = new Interface("Publication" , [" getIsbn", "setIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]);
var Book = function(newIsbn, newTitle, newAuthor) {
// プライベート属性
var isbn, title, author;
// プライベート メソッド
function checkIsbn(isbn) {
if(isbn == unknown || typeof isbn != "string") return false;
isbn = isbn.replace("-", "");
if(isbn.length != 10 &&isbn.length != 13) return false; 🎜>if (isbn.length == 10) {
if(!isbn.match(^d{9})) return false;
for(var i = 0;i sum = isn.charAt(i) * (10 - i);
}
var checksum = sum % 11;
if(checksum == 10) checksum = "X"; >if(isbn.charAt(9) != チェックサム) return false;
} else {
if(!isbn.match(^d{12})) return false; 0;i sum = isn.charAt(i) * (i % 2 == 0 ? 1 : 3);
var checksum = sum % 10; 🎜>if (isbn.charAt(12) != checksum) return false;
}
return true;
}
// 特権メソッド
this.getIsbn = function() {
return
};
this.setIsbn = function(newIsbn) {
if(!checkIsbn(newIsbn)) {
throw new Error("書籍: 無効な ISBN。");
}
isbn = newIsbn;
}
this.getTitle = function() {
タイトルを返す;
},
this.setTitle = function(newTitle) {
title = newTitle || "";
},
this.getAuthor: function() {
著者を返す;
},
this.setAuthor: function(newAuthor) {
author = newAuthor || "";
}
// 出版物インターフェース
this.setTitle(newTitle); );
}
// public メソッド
Book.prototype = {
display: function() {
return "書籍: ISBN: " this.getIsbn() ",Title: " this.getTitle () ",Author: " this.getAuthor();
}
};
このソリューションと前のソリューションの違いは何ですか?まず、コンストラクター内で var を使用して 3 つのプライベート メンバーを宣言し、コンストラクター内でのみ有効なプライベート メソッド checkIsbn() も宣言します。 this キーワードを使用して特権メソッドを宣言します。つまり、コンストラクター内で宣言されますが、プライベート メンバーにアクセスできます。プライベート メンバーにアクセスする必要のないメソッドはすべて Book.prototype で宣言されます (display など)。つまり、プライベート メンバーにアクセスする必要があるメソッドを特権メソッドとして宣言することが、この問題を解決する鍵となります。ただし、このアクセスにはいくつかの欠点もあります。たとえば、インスタンスごとに特権メソッドのコピーを作成する必要があり、必然的により多くのメモリが必要になります。私たちは、直面している問題を解決するために静的メンバーの最適化と使用を続けています。ちなみに、静的メンバーはクラスにのみ属し、すべてのオブジェクトは 1 つのコピーのみを共有します (「オブジェクト指向 Javascript 2 (インターフェイスの実装)」で説明されています。「Interface.ensureImplements メソッド」を参照)。一方、インスタンス メソッドは Word オブジェクト用です。
コードをコピー
コードは次のとおりです:
var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]);
var Book = (function() {
// プライベート静的属性
var numsOfBooks = 0;
// プライベート静的メソッド
function checkIsbn(isbn) {
if(isbn == 未定義 || isbn のタイプ != "string") return false;
isbn = isbn.replace("-", ""); 13) false を返します;
var sum == 10) {
if(!isbn.match(^d{9}))
を返します。 (var i = 0;i sum = isn.charAt(i) * (10 - i)
}
var checksum = sum % 11; (チェックサム == 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) return false;
} else {
if(!isbn.match(^d{12) })) false を返します;
for(var i = 0;i sum =isbn.charAt(i) * (i % 2 == 0 ? 1 : 3); 🎜>}
var checksum = sum % 10;
if(isbn.charAt(12) != checksum) return false;
}
return
}
// return コンストラクター
return function(newIsbn, newTitle, newAuthor) {
// プライベート属性
var isbn, title, author;
// 特権メソッド
this.getIsbn = function() {
isbn を返す;
};
this.setIsbn = function(newIsbn) {
if(!Book.checkIsbn(newIsbn)) {
throw new Error("書籍: 無効な ISBN。");
}
isbn = newIsbn;
}
this.getTitle = function() {
タイトルを返す;
},
this.setTitle = function(newTitle) {
title = newTitle || "";
},
this.getAuthor = function() {
著者を返す;
},
this.setAuthor = function(newAuthor) {
author = newAuthor || "";
}
Book.numsOfBooks ;
if(Book.numsOfBooks > 50) {
throw new Error("Book: Book のインスタンスは最大 50 個作成できます。");
}
// Publication インターフェース
this.setIsbn(newIsbn); を実装します。
this.setTitle(newTitle);
this.setAuthor(newAuthor);
};
})();
// public static メソッド
Book.convertToTitle = function(title) {
return title.toUpperCase();
}
// public メソッド
Book.prototype = {
display: function() {
return "Book: ISBN: " this.getIsbn() ",Title: " this. getTitle() ",Author: " this.getAuthor();
}
};
この方法は上記と同様に、var と this を使用して静的メソッドを構築することと、checkIsbn を私的静的メソッドとして指定する点が異なります。必要に応じて、私たちがすべてのオブジェクトを公開する 1 つの関数をサブ本にするという解決策を考えています。ここで私たちは 1 つの問題を検討し、>の最大印刷量が 500 であるなど、さまざまな制限を設ける必要があると考えています。 > 最大印刷量は 1000 であり、つまり、最大印刷量の定期的な量が必要です。
暗号化

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

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

Dreamweaver Mac版
ビジュアル Web 開発ツール

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

ホットトピック









