ホームページ ウェブフロントエンド jsチュートリアル オブジェクト指向 Javascript その 3 (カプセル化と情報隠蔽)_js オブジェクト指向

オブジェクト指向 Javascript その 3 (カプセル化と情報隠蔽)_js オブジェクト指向

May 16, 2016 pm 05:56 PM
カプセル化 オブジェクト指向

同時に、高級オブジェクト指向言語では、プライベート メンバーを含むオブジェクトの作成が最も基本的な機能の 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;
}

isbn が正しいかどうかによって表示方法が異なります。正しくない場合は取得できません画像とリンクです。これを念頭に置いて、本のタイトルと著者はオプションですが、各書籍にISBNが存在する必要があります。表面的には、isbn パラメータを指定するだけで正常に実行できるように見えます。ただし、isbn の完全性を保証することはできません。これに基づいて、書籍チェックをより堅牢にするために、isbn 検証を追加しました。

コードをコピーします コードは次のとおりです:
var Book = function(isbn, title,著者) {
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 であるなど、さまざまな制限を設ける必要があると考えています。 <<.NET>> 最大印刷量は 1000 であり、つまり、最大印刷量の定期的な量が必要です。



暗号化
暗号化は次のように実行できます。

var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]);
var Book = (function() {
// プライベート静的属性
var numsOfBooks = 0;
// プライベート静的定数
var Constants = {
"MAX_JAVASCRIPT_NUMS": 500 ,
"MAX_NET_NUMS": 1000
};
// プライベート静的特権メソッド
this.getMaxNums(name) {
return Constants[name.ToUpperCase()];
// private static メソッド
function checkIsbn(isbn) {
if(isbn == unknown || typeof isbn != "string") return false;
isbn = isbn.replace("- ", "");
if(isbn.length != 10 &&isbn.length != 13) return false;
var sum = 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(checksum == 10) checksum = "X"; return 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>i​​f(isbn.charAt(12) != checksum ) false を返します。
}
true を返します。
}
// return コンストラクター
return function(newIsbn, newTitle, newAuthor) {
// プライベート属性
var isbn, title, author;
// 特権メソッド
this.getIsbn = function() {
return 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() "、最大値: ";
},
showMaxNums: function() {
return Book.getMaxNums("MAX_JAVASCRIPT_NUMS");
}
};


最も完璧な場合は、パッケージ化されたプログラムが管理者にとって必要なだけであり、どのように実行されるかは根本的に考慮されていません。必然的に、パッケージングされたコンテンツが大きくなり、ターゲットのやり取りが発生すると、有効領域やパケットなどの概念が十分に理解されていないため、要求がこれほど大きくなる場合があります。ソース コード (ここでは必ずしもインターフェイスの変更を意味するわけではありません) は、送信されたソース コードが劣化していない限り、新しく追加される可能性があるため、推奨されません。扩展。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

TrendForce: Nvidia の Blackwell プラットフォーム製品により、TSMC の CoWoS 生産能力は今年 150% 増加します TrendForce: Nvidia の Blackwell プラットフォーム製品により、TSMC の CoWoS 生産能力は今年 150% 増加します Apr 17, 2024 pm 08:00 PM

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などの製品を提供する予定だが、上流のウェーハパッケージングではさらに複雑な製品を採用する必要がある。

Java で Jackson を使用する @JsonIdentityInfo アノテーションの重要性は何ですか? Java で Jackson を使用する @JsonIdentityInfo アノテーションの重要性は何ですか? Sep 23, 2023 am 09:37 AM

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

AMD「Strix Halo」FP11のパッケージサイズを公開:Intel LGA1700と同等、Phoenixより60%大きい AMD「Strix Halo」FP11のパッケージサイズを公開:Intel LGA1700と同等、Phoenixより60%大きい Jul 18, 2024 am 02:04 AM

この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 でオブジェクト指向プログラミングを探索する Go でオブジェクト指向プログラミングを探索する Apr 04, 2024 am 10:39 AM

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

PHP の高度な機能: オブジェクト指向プログラミングのベスト プラクティス PHP の高度な機能: オブジェクト指向プログラミングのベスト プラクティス Jun 05, 2024 pm 09:39 PM

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

PHP のパッケージング技術とアプリケーション PHP のパッケージング技術とアプリケーション Oct 12, 2023 pm 01:43 PM

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

C++ 関数はコードをカプセル化することで GUI 開発の効率をどのように向上させますか? C++ 関数はコードをカプセル化することで GUI 開発の効率をどのように向上させますか? Apr 25, 2024 pm 12:27 PM

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

Go言語のオブジェクト指向機能の分析 Go言語のオブジェクト指向機能の分析 Apr 04, 2024 am 11:18 AM

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

See all articles