コードを開始する前に、相続の目的とどのような利益がもたらすかを明確に理解する必要があります。一般的に言えば、クラスを設計するときは、重複コードを削減し、クラス間の結合を弱めることを望んでいます。両方の世話をすることは困難です。顔からオブジェクトの言語の継承を理解することによれば、継承は直接的な強い結合をもたらしますが、そのユニークな柔軟性により、JSは強力な結合と弱い結合コード、高効率、非効率的なコードを設計できます。そして、あなたが使用するものは状況に依存します。
以下は、JSの3つの継承方法を提供します:クラスの継承、プロトタイプの継承、および混合。クラスの継承の簡単な説明があります。
クラスフォーム継承。
JSタイプの継承の実現は、プロトタイプチェーンに依存します。元のチェーンは何ですか? JSのオブジェクトには、この属性がオブジェクトタイプへの参照を返します。これは、オブジェクトのクラスの基本関数のセットを提供します。
ちなみに、このようなコードを使用することがよくあります。
次のようにコードコードをコピーします。
var person = function(){
this.name = "liyatang";
};
person.prototype = {
//ここで人の基本機能を提供できます
getName:function(){
this.nameを返します。
}
}
プロトタイププロパティにクラスの基本機能を配置し、人物の参照にxxx関数があることを示します。
プロトタイプを理解した後、元のチェーンが何であるかを理解する必要があります。訪問オブジェクトのメンバー(属性またはメソッド)は、メンバーが現在のオブジェクトに表示されない場合、JSは、プロトタイプ属性で参照されるオブジェクトに表示されます。見つからない場合、それは未定に戻ります。
では、元のチェーンが私たちに何を与えているのでしょうか?プライマリチェーンは、あるクラスが親クラスを指すインスタンスとして、別のクラスを継承できるようにすることを意味します。これにより、親クラスのメンバーがサブクラスに結合します。なぜなら、サブクラスで見つからないときに親クラスが見つかるからです。 (上記の2つの単語の段落は厳密ではなく、簡単な単語からのみ記述されています)
以下には中国のクラスが必要であり、名前のクラスの名前とGetNameメンバーを継承する必要があります。
次のようにコードコードをコピーします。
var中国語= function(name、nation){
//継承、親クラスのコンストラクターを呼び出す必要があります、あなたはそれを呼び出しで呼び出すことができます、この点は中国語に
//この範囲で人に電話することができます
person.call(this、name);
this.nation = national;
};
中国語.prototype = person.prototype;
//プロトタイプ属性がカバーされているため、それは以前と同じではありません
//chinese.prototype = {
// getNation:function(){{
// this.nationを返します。
//}
//};
//将来の方法はこのように追加する必要があります
中国語.prototype.getNation = function(){
this.nationを返します。
};
相続関係が確立され、私たちはそれをこのように呼びます
次のようにコードコードをコピーします。
var c = new Chinese( "liyatang"、 "China");
alert(c.getname());
そのため、タイプの継承が完了します。それは本当に完了しましたか?FireBugを使用してアラートでポイントをオフにします。元の人が変更され、GetNationメソッドが追加されました。
これは、上記のCode chinese.prototype = person.prototypeであり、中国人も修正されているためです。これはそれ自体が容認されておらず、私たちが望む効果ではありません。
別のオブジェクトまたはインスタンスの結合を弱めることができます。
次のようにコードコードをコピーします。
//
//chinese.prototype = new Person();
// 2番目のタイプ
// var f = function(){};
//f.prototype = person.prototype;
//chinese.prototype = f.prototype;
これら2つの方法の違いは何ですか? 2番目のタイプに空の関数fを追加します。これは、親クラスが大きくなり、親クラス構造関数には副作用があるため、親クラスの作成のインスタンスを回避できます。タスクが実行されます。したがって、2番目の方法をお勧めします。
この時点で、まだ終わりました!オブジェクトの属性の属性には属性があり、特定のオブジェクトインスタンスの関数への参照を保持します。この声明によると、chiese.prototype.constructorは中国語と等しくなければなりませんが、実際にはそうではありません。
Chieseのプロトタイプチェーンが記憶の前にセットアップされたとき、私たちはPerson.prototypeをChiese.prototypeから取り上げました。したがって、この時点で、Chiese.Prototype.Constructorは人です。また、次のコードを追加する必要があります
次のようにコードコードをコピーします。
//ここでの条件を調査する必要はありません。
if(hisshen.prototype.constructor == object.prototype.constructor){
中国語.prototype.constructor =中国;
}
次のようにコード全体に変えます
次のようにコードコードをコピーします。
var person = function(name){
this.name = name;
};
person.prototype = {
getName:function(){
this.nameを返します。
}
};
var中国語= function(name、nation){
person.call(this、name);
this.nation = national;
};
var f = function(){};
f.prototype = person.prototype;
中国語.prototype = f.prototype;
if(hisshen.prototype.constructor == object.prototype.constructor){
中国語.prototype.constructor =中国;
}
中国語.prototype.getNation = function(){
this.nationを返します。
};
var c = new Chinese( "liyatang"、 "China");
alert(c.getname());
継承コードを関数に配置できる場合、コードが再利用するのに便利であり、コードの最後の並べ替えは次のとおりです。
次のようにコードコードをコピーします。
関数拡張(サブクラス、スーパークラス){{
var f = function(){};
f.prototype = superclass.prototype;
subclass.prototype = new f();
subclass.prototype.constructor = subclass;
subclass.superclass = superclass.prototype;
if(superclass.prototype.constructor == object.prototype.constructor){
superclass.prototype.constructor = superclass;
}
}
var person = function(name){
this.name = name;
};
person.prototype = {
getName:function(){
this.nameを返します。
}
};
var中国語= function(name、nation){
person.call(this、name);
this.nation = national;
};
拡張(中国語、人);
中国語.prototype.getNation = function(){
this.nationを返します。
};
var c = new Chinese( "liyatang"、 "China");
alert(c.getname());
公開後の変更:
1階のコメントの下で、その拡張機能の新しいビューがあります。元のチェーンの設定方法を議論するときに2つの方法が提案されました
次のようにコードコードをコピーします。
//
//chinese.prototype = new Person();
// 2番目のタイプ
// var f = function(){};
//f.prototype = person.prototype;
//chinese.prototype = f.prototype;
親クラスの構築機能を減らす2番目の方法は、Person.Call(この名前)が中国のクラスを設計するときに使用されます。
ただし、最初の方法では、中国語のこの部分(この名前)を減らすことができます。この関数コードを拡張することを希望する場合があります。書くだけです
中国語.prototype = new Person()も同じ目的を達成します。
しかし、物忘れは、中国語.prototype = new person()であるということです。答えは間違っています!明らかに、新しい人()は名前パラメーターを渡す必要があります。拡張機能のこの部分を実行することはできないため、中国クラスの親クラスコンストラクターを呼び出す必要があります。これは、オブジェクト指向のアイデアにも沿っています。
したがって、2番目の方法を使用することをお勧めします。
私がこのように技術的な記事について最初に書いたとき、それは私自身の考えに従って舗装されています。