この記事は 2 つの部分に分かれており、上の部分では完全な公開、下線表記、クロージャーの使用について説明し、下の部分では静的メソッドとプロパティ、定数、その他の知識ポイントについて説明します。
カプセル化はオブジェクト指向言語の非常に基本的で便利な機能です。JavaScript もオブジェクト指向言語と言えますが、プライベートおよびプロテクトを使用する限り、他の言語とは異なり、カプセル化のサポートはあまり良くありません。それは達成できます。しかし、これは方法がないという意味ではありません。次に、JavaScript でカプセル化を実装する方法を紹介します。
1. 基本パターン には主に、全面露出法、下線表記法、クロージャーの使用の 3 つの方法があります。 (閉鎖は非常に重要かつ難しい概念です。興味のある友人はオンラインで情報を見つけることができます。また、他の人の記事を私のブログに転載しました)。
ここでは book クラスを例として取り上げ、book クラスを作成して初期化する必要があります。
1. 完全公開メソッド:
....
}
....
public void Display( )
{
.... .
}
}
JavaScript でもこのメソッドを使用できますが、上記で使用したメソッドを使用してクラス定義関数 (またはコンストラクター) に属性を定義し、メソッドをプロトタイプ オブジェクトに定義することをお勧めします。この方法の方がパフォーマンスが優れています。その理由は、Google にアクセスしてください。
上記の JS コードが実現したい機能は、3 つのプライベート変数 (または属性)、isbn、title、author、プライベート メソッド checkIsbn、およびいくつかのパブリック メソッド getIsdn、setIsdn を含む book クラスを定義することです。 。画面。アイデアは良いのですが、現実は残酷です。実際、これらのプライベート プロパティやメソッドはまったくプライベートではありません。たとえば、theHobbit.isbn = '978-0261103283'; この方法で、エラーなく、isbn に値を割り当てることができ、完全に成功します。その理由は、JavaScript には特定のオブジェクトをプライベート化するプライベートな方法がないためです。さらに、この実装メソッドは使用時に混乱を引き起こす可能性があります。クラスの作成者はどのようなプロパティとメソッドを公開したいのか?以下に最初の改善方法である下線を付ける方法を紹介します。
2. 下線表記:
var Book = function(isbn, title, author) {
// コンストラクター コード。
this.setTitle(title);
}
Book.prototype = {
//isbn function
_checkIsbn: function(isbn) {
... function() { return this._isbn>},
//isbn を設定
setIsbn: function(isbn) { ('書籍: 無効な ISBN。'); This._isbn = isb;
},
...
display: function( ) { ..
}
};
実際には、プライベートに実装するすべてのプロパティまたはメソッドの前にアンダースコア _ を追加するだけです。手術。このメソッドは真のプライベート化を達成しません。この操作は依然として成功します。このメソッドの最大の意義は、作成者がどのオブジェクトを公開するつもりであるかをクラスのユーザーに伝えることです。暴露したくない。しかし、作者はユーザーが作者のアイデアに従うかどうかを制御できません。
では、真の民営化を達成する方法はあるのでしょうか? 答えは「はい」です。クロージャを使用することです。
3. クロージャを使用します:
JavaScript が真のカプセル化を達成できる理由は、その独自の関数スコープ、内部関数の関数サポート、およびクロージャから切り離すことができません。オンラインで関連知識を収集し、理解を深めることができます。
以下で最初に説明するのは、JavaScript では、変数が関数内で定義されている場合、関数の外部からその変数にアクセスする方法はありません。実際、JavaScript でプライベート プロパティまたはメソッドを実装すると、この特別なプロパティが利用されます。例:
コードをコピー
コードは次のとおりです。
function foo() {
var a = 10;
コードをコピー
コードは次のとおりです。
function foo() {
var a = 10 ;
関数 bar() {
a *= 2;
}
戻り bar; // baz は関数 bar への参照になります。
baz(); // 40 を返します。
baz(); var blat = foo(); // blat は bar への別の参照です。
blat(); // a の新しいコピーが使用されているため、これが返されます。前述したように、JavaScript 関数は内部関数をサポートしています。内部関数 bar はプライベート変数 a にアクセスでき、関数 foo は内部関数 bar を baz にスローし、baz はクロージャを実装する内部変数 a にアクセスできます。このようにして、プライベート変数とメソッドが実際に実装されていることが一目でわかります。前の本の例に戻ると、実装は次のとおりです。 コードをコピーします
コードは次のとおりです:
var Book = function(newIsbn, newTitle, newAuthor) {
// Publication
// プライベート属性を実装します。
varisbn、タイトル、著者;
// プライベートメソッド。
function checkIsbn(isbn) {
...
}
// 特権メソッド。
this.getIsbn = function() {
return isbn;
};
this.setIsbn = function(newIsbn) {
if(!checkIsbn(newIsbn)) throw new Error('Book: Invalid ISBN.');
isbn = newIsbn;
};
this.getTitle = function() {
タイトルを返す;
};
this.setTitle = function(newTitle) {
title = newTitle || 'タイトルが指定されていません';
};
this.getAuthor = function() {
作者を返す;
};
this.setAuthor = function(newAuthor) {
著者 = newAuthor || 「著者が指定されていません」;
};
// コンストラクターコード。
this.setIsbn(newIsbn);
this.setTitle(newTitle);
this.setAuthor(newAuthor);
};
// 公開された非特権メソッド。
Book.prototype = {
display: function() {
...
}
};
上記のコードは、isbn、title、author、および checkIsbn の非公開化を実現し、外部からは直接アクセスできないように設定されています。 isbn の値のように、theHobbit.setIsbn = '978-0261103283'; のみを使用できます。 🎜> よろしくお願いします。今日の内容はここに到達しています。大家様のご協力を希望します。
作者:下一站永远