jsオブジェクト指向におけるカプセル化と継承について整理してみましょう。
1. カプセル化
js でカプセル化を実装するにはさまざまな方法があります。一般的に使用される方法をいくつか紹介します。
1.1 オリジナルモード生成オブジェクト
メンバーをオブジェクトに直接書き込み、関数で返します。 欠点: パターンのインスタンスを確認するのが困難です。
コード:
関数 Stu(名前, スコア) {
return {
名前: 名前、
スコア: スコア
}
}
var stu1 = Stu("张三", 80);
var stu2 = Stu("李思", 90);
console.log(stu1.name); // チャン・サン
1.2 構築パターンオブジェクトの生成
js は、コンストラクターを使用してオブジェクトを生成するパターンを提供します。いわゆる「コンストラクター」は実際には通常の関数ですが、this 変数は内部で使用されます。 new キーワードを使用してコンストラクターのインスタンスを生成すると、この変数はインスタンス オブジェクトにバインドされます。
コードを直接入力します:
関数 Stu(名前, スコア) {
This.name = 名前,
This.score = スコア
}
var stu1 = new Stu("张三", 80);
var stu2 = new Stu("李思", 90);
console.log(stu1.name "/" stu2.score) // 張三 90
console.log((stu1.constructor == Stu) "/" (stu2.constructor == Stu)); // true true
console.log((stu1 インスタンスオブ Stu) "/" (stu2 インスタンスオブ Stu)); // true true
js コンストラクターによって生成されたオブジェクトが、C# のクラスによって生成されたオブジェクトとまったく同じであることを確認するのは難しくありません。どちらもテンプレートを使用してオブジェクト メンバーを定義し、new キーワードを通じてインスタンス化します。
C# コードを使用して同じ Stu オブジェクトを生成します
クラスストゥ
{
パブリック文字列名;
公開ダブルスコア;  ̄ ̄ ̄ ̄ ̄
}
OK、これで基本的なオブジェクトができました。 したがって、すべてのオブジェクトに共通で、このメソッドの作成を 1 回だけ許可するメソッドが必要になります。 (object newで繰り返し作成されない)どうすればいいでしょうか? C# では静的メンバーを使用できることは誰もが知っています。では、jsでそれを行うにはどうすればよいでしょうか?
1.3 プロトタイプモード
js では、各コンストラクターにはプロトタイプ属性があり、このオブジェクトのすべてのプロパティとメソッドはコンストラクターのインスタンスによって継承されます。この場合、メンバーをプロトタイプに直接追加することは、C# で静的メンバーを宣言することと同じになります。
コード:
関数 Stu(名前, スコア) {
This.name = 名前,
This.score = スコア
}
Stu.prototype.type='学生';
Stu.prototype.log = 関数 (s) {
console.log(s);
}
var stu1 = new Stu("张三", 80);
var stu2 = new Stu("李思", 90);
console.log(stu1.type "/" stu2.type); // 学生 学生
;
stu1.log('hello') // こんにちは
;
console.log(stu1.log == stu2.log); // true
カプセル化についてはこれで終わりです。js で継承がどのように実装されるかを見てみましょう。
2. 継承
2.1 コンストラクターのバインディング
子関数の call または apply メソッドを直接呼び出して、親オブジェクトのコンストラクターを子オブジェクトにバインドします。
関数 Stu(名前, スコア) {
Grade.apply(this, 引数);
//Grade.call(this, argument);
This.name = 名前,
This.score = スコア
}
関数 Grade() {
This.code = "中学校";
This.ask = function () {
console.log("皆さんこんにちは");
}
}
var stu1 = new Stu("张三", 80);
var stu2 = new Stu("李思", 90);
console.log(stu1.code); // 中学校
stu1.ask(); // 皆さんこんにちは
ここでの apply は 2 つのことを行い、最初のパラメーター this を Grade コンストラクター (呼び出し元) に渡し、その後 Grade でコードを実行します。 Gradeでこれで定義したメンバーをStuで再度実行するのと同じです。
2.2 プロトタイプによる継承
まずはコードを見てください
コード:
関数 Stu(名前, スコア) {
This.name = 名前,
This.score = スコア
}
関数 Grade() {
This.code = "中学校";
}
Stu.prototype = new Grade();
Stu.prototype.constructor = Stu; //継承連鎖の乱れを防ぎ、ステートメントを手動でリセットします
var stu1 = new Stu("张三", 80);
var stu2 = new Stu("李思", 90);
console.log(Stu.prototype.constructor); // 独自のコンストラクター
console.log(stu1.code); // 中学校
前に述べたように、プロトタイプは C# の静的メンバーに相当するため、親クラスのすべてのメンバーを独自の静的メンバーに変換して継承を実現します。
プロトタイプによる継承には欠点があります。継承されたメンバーはすべて静的であるため、オブジェクトのメンバーを継承するにはどうすればよいでしょうか?
2.3 継承のコピー
親オブジェクトのすべてのプロパティとメソッドを子オブジェクトにコピーして、継承を実現します。
コード:
関数 Stu(名前, スコア) {
This.name = 名前,
This.score = スコア
}
関数 Grade() {}
Grade.prototype.code = "中学校";
}
//関数のカプセル化
関数 extend(C, P) {
var p = P.prototype;
var c = C.prototype;
for (var i in p) {
c[i] = p[i];
}
}
extend(Stu, Grade);
var stu1 = new Stu("张三", 80);
var stu2 = new Stu("李思", 90);
stu1.code='高校';
console.log(stu1.code); // 高校
console.log(stu2.code); // 中学校
console.log(Stu.prototype.constructor);
console.log(Grade.prototype.constructor)
これで、JS オブジェクト指向の組織は静的ではなくなり、使用時に必要に応じて変更できます。良いことわざがあります。正しいものが最善です。
ここではカプセル化と継承のみを分析します。今後、JavaScript オブジェクト指向プログラミングをより深く理解していただくために、他の記事もいくつか取り上げる予定です。もちろん、これらはすべて個人的な理解です。漏れがある場合は、ご連絡ください。