オブジェクト指向 Javascript その 3 (カプセル化と情報隠蔽)_js オブジェクト指向
同時に、高級オブジェクト指向言語では、プライベート メンバーを含むオブジェクトの作成が最も基本的な機能の 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 つの問題を検討し、<
暗号化

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック











4月17日の当サイトのニュースによると、TrendForceは最近、Nvidiaの新しいBlackwellプラットフォーム製品に対する需要は強気で、2024年にはTSMCのCoWoSパッケージング総生産能力が150%以上増加すると予想されるレポートを発表した。 NVIDIA Blackwell の新しいプラットフォーム製品には、B シリーズ GPU と、NVIDIA 独自の GraceArm CPU を統合する GB200 アクセラレータ カードが含まれます。 TrendForce は、サプライチェーンが現在 GB200 について非常に楽観的であることを確認しており、2025 年の出荷台数は 100 万台を超え、Nvidia のハイエンド GPU の 40 ~ 50% を占めると予想されています。 Nvidiaは今年下半期にGB200やB100などの製品を提供する予定だが、上流のウェーハパッケージングではさらに複雑な製品を採用する必要がある。

@JsonIdentityInfo アノテーションは、Jackson ライブラリ内でオブジェクトに親子関係がある場合に使用されます。 @JsonIdentityInfo アノテーションは、シリアル化および逆シリアル化中にオブジェクトの ID を示すために使用されます。 ObjectIdGenerators.PropertyGenerator は、使用されるオブジェクト識別子が POJO プロパティから取得される状況を表すために使用される抽象プレースホルダー クラスです。構文@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

このWebサイトは7月9日、AMD Zen5アーキテクチャの「Strix」シリーズプロセッサには2つのパッケージングソリューションがあり、小型のStrixPointはFP8パッケージを使用し、StrixHaloはFP11パッケージを使用すると報じた。出典: videocardz 出典 @Olrak29_ 最新の事実は、StrixHalo の FP11 パッケージ サイズが 37.5mm*45mm (1687 平方ミリメートル) であり、これは Intel の AlderLake および RaptorLake CPU の LGA-1700 パッケージ サイズと同じであるということです。 AMD の最新の Phoenix APU は、サイズ 25*40mm の FP8 パッケージング ソリューションを使用しています。これは、StrixHalo の F

Go 言語は、型定義とメソッドの関連付けを通じてオブジェクト指向プログラミングをサポートします。従来の継承はサポートされていませんが、合成を通じて実装されます。インターフェイスは型間の一貫性を提供し、抽象メソッドを定義できるようにします。実際の事例では、顧客操作の作成、取得、更新、削除など、OOP を使用して顧客情報を管理する方法を示します。

PHP における OOP のベスト プラクティスには、命名規則、インターフェイスと抽象クラス、継承とポリモーフィズム、依存関係の注入が含まれます。実際のケースには、ウェアハウス モードを使用してデータを管理する場合や、ストラテジー モードを使用して並べ替えを実装する場合などがあります。

PHP のカプセル化テクノロジとアプリケーションのカプセル化は、オブジェクト指向プログラミングにおける重要な概念であり、外部プログラムに統一されたアクセス インターフェイスを提供するために、データとデータに対する操作を一緒にカプセル化することを指します。 PHP では、アクセス制御修飾子とクラス定義を通じてカプセル化を実現できます。この記事では、PHP のカプセル化テクノロジとそのアプリケーション シナリオを紹介し、いくつかの具体的なコード例を示します。 1. カプセル化されたアクセス制御修飾子 PHP では、カプセル化は主にアクセス制御修飾子によって実現されます。 PHP には 3 つのアクセス制御修飾子が用意されています。

コードをカプセル化することにより、C++ 関数は GUI 開発効率を向上させることができます。 コードのカプセル化: 関数はコードを独立した単位にグループ化し、コードの理解と保守を容易にします。再利用性: 関数はアプリケーション間で再利用できる共通の機能を作成し、重複やエラーを削減します。簡潔なコード: カプセル化されたコードにより、メイン ロジックが簡潔になり、読みやすく、デバッグしやすくなります。

Go 言語は、オブジェクト指向プログラミング、構造体によるオブジェクトの定義、ポインター レシーバーを使用したメソッドの定義、インターフェイスによるポリモーフィズムの実装をサポートしています。オブジェクト指向の機能は、Go 言語でのコードの再利用、保守性、カプセル化を提供しますが、クラスや継承、メソッド シグネチャ キャストといった従来の概念が欠如しているなどの制限もあります。
