JSオブジェクト指向のカプセル化と継承を整理しましょう。
1。パッケージ
JSにはカプセル化のための多くの実装方法があり、ここにいくつかの一般的に使用されるものがあります。
1.1元のパターン生成オブジェクト
メンバーを直接オブジェクトに書き込み、関数で返します。短所:パターンの例であることを確認することは困難です。
コード:
コードコピーは次のとおりです。
function stu(name、score){
戻る {
名前:名前、
スコア:スコア
}
}
var stu1 = stu( "Zhang San"、80);
var stu2 = stu( "li si"、90);
console.log(stu1.name); // Zhang San
1.2構築されたパターンオブジェクトを生成します
JSは、コンストラクターを使用してオブジェクトを生成するためのパターンを提供するのに役立ちます。いわゆる「コンストラクター」は実際には通常の関数ですが、この変数は内部で使用されます。新しいキーワードを使用してコンストラクターのインスタンスを生成すると、この変数はインスタンスオブジェクトにバインドされます。
コードを直接アップロードします。
コードコピーは次のとおりです。
function stu(name、score){
this.name = name、
this.score = score
}
var stu1 = new Stu( "Zhang San"、80);
var stu2 = new Stu( "li si"、90);
console.log(stu1.name + "/" + stu2.score); // Zhang San90
console.log((stu1.constructor == stu) + "/" +(stu2.constructor == stu)); // true true
console.log((stu1 instanceof stu) + "/" +(stu2 instance of stu)); // true true
JSコンストラクターがオブジェクトを生成し、クラスでC#がオブジェクトを生成することを確認するのは難しくありません。どちらもテンプレートを使用して、オブジェクトメンバーを新しいキーワードでインスタンス化します。
C#コードを使用して同じSTUオブジェクトを生成します
コードコピーは次のとおりです。
クラスSTU
{
パブリック文字列名;
パブリックダブルスコア。
}
わかりました、これが基本的なオブジェクトです。そのため、すべてのオブジェクトが一般的である方法が必要であり、この方法は1回だけ作成されています。 (新しいオブジェクトを繰り返し作成しないでください)私は何をすべきですか?誰もがC#で静的メンバーを使用できることを知っています。では、JSでそれを行う方法は?
1.3プロトタイプモード
JSでは、各コンストラクターにはプロトタイプ属性があり、このオブジェクトのすべてのプロパティとメソッドは、コンストラクターインスタンスによって継承されます。次に、メンバーをプロトタイプに直接追加することは、C#で静的なメンバーを宣言することと同等です。
コード:
コードコピーは次のとおりです。
function stu(name、score){
this.name = name、
this.score = score
}
stu.prototype.type = 'sudent';
stu.prototype.log = function(s){
console.log(s);
}
var stu1 = new Stu( "Zhang San"、80);
var stu2 = new Stu( "li si"、90);
console.log(stu1.type + "/" + stu2.type); //学生
stu1.log( 'hello'); // こんにちは
console.log(stu1.log == stu2.log); // 真実
それはすべてカプセル化についてです。 JSで継承がどのように実装されているかを見てみましょう。
2。継承
2.1コンストラクター結合
子の関数にメソッドを直接呼び出したり、適用して、親オブジェクトのコンストラクターを子オブジェクトにバインドします。
コードコピーは次のとおりです。
function stu(name、score){
grade.apply(this、arguments);
//grade.call(this、arguments);
this.name = name、
this.score = score
}
関数グレード(){
this.code = "Junior High School";
this.ask = function(){
console.log( "こんにちはみんな");
}
}
var stu1 = new Stu( "Zhang San"、80);
var stu2 = new Stu( "li si"、90);
console.log(stu1.code); //中学校
stu1.ask(); // こんにちは、みんな
ここで2つのことを適用し、最初のパラメーターをグレードコンストラクター(発信者)に配置してから、グレードのコードを実行します。これは、Gradeで定義されているメンバーをSTUで再び実行することに相当します。
2.2プロトタイプによる継承
最初にコードを見てください
コード:
コードコピーは次のとおりです。
function stu(name、score){
this.name = name、
this.score = score
}
関数グレード(){
this.code = "Junior High School";
}
stu.prototype = new Grade();
stu.prototype.constructor = stu; //相続鎖障害を防ぎ、宣言を手動でリセットします
var stu1 = new Stu( "Zhang San"、80);
var stu2 = new Stu( "li si"、90);
console.log(stu.prototype.constructor); //独自のコンストラクター
console.log(stu1.code); //中学校
前述のように、プロトタイプはC#の静的メンバーと同等であるため、親クラスのすべてのメンバーを独自の静的メンバーに変えて、相続を達成します。
プロトタイプを介して継承することには欠点があります。すべての継承されたメンバーは静的です。したがって、オブジェクトメンバーを継承する方法は?
2.3継承をコピーします
親オブジェクトのすべてのプロパティとメソッドを子オブジェクトにコピーして、継承を実現します。
コード:
コードコピーは次のとおりです。
function stu(name、score){
this.name = name、
this.score = score
}
関数グレード(){}
grade.prototype.code = "Junior High School";
}
//関数カプセル化
関数拡張(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( "Zhang San"、80);
var stu2 = new Stu( "li si"、90);
stu1.code = 'High School';
console.log(stu1.code); // 高校
console.log(stu2.code); //中学校
console.log(stu.prototype.constructor);
console.log(grade.prototype.constructor)
これは、JSオブジェクト指向の組織について書いたものです。このことは静的ではありません。それを使用するときは、ニーズに応じて変更を加えます。非常にうまく行くということわざがあります、正しいものは最高です。
これは、カプセル化と継承についてのみ分析されます。私たちは、友人がJavaScriptオブジェクト指向のプログラミングをより深く理解できるようにするために、将来他の記事をいくつか行います。もちろん、それはすべて個人的な理解です。省略がある場合は、私に連絡してください。