javascript設計モード学習ノートの「類型継承」

2555 ワード

一つのことをする前に、まずこのことをするメリットが何かを明確にして、誰も理由もなくしたいと思いません.一般的に言えば、私達は設計類の時に、実際には重複性のコードを減らすことができることを望んでいます.継承機構を利用して、既存の種類に基づいて再度設計して、すでに持っている各方法を十分に利用して、設計の修正ももっと楽です.余計なことを言わないで、例を挙げて説明します.
function Person(name){

    this.name = name;

}

Person.prototype.getname = function(){

    return this.name;

}



function Bloger(name,blog){

    Person.call(this,name);

    this.blog = blog;

}

var bloger = new Bloger("zhenn","http://www.men-ideal.com");

alert(bloger.name=="zhenn");   /*  ture*/

alert(bloger.blog)   /*  http://www.men-ideal.com*/

alert(bloger.getname()=="zhenn");   /*  "bloger.getname is not a function"*/

上記の例によって、Blogerはその内部でPersonの父の属性と方法(callについての説明は参照をお願いします.)をcallによって動的に呼び出しました.つまり、BlogerはPersonのサブクラスを継承したと理解できますが、注意深い学生はPersonのプロトタイプの中の方法が、コールのみに依存していることを発見します.これはつまり「bloger.getname is not a function」を提示する原因です.でも、心配しないでください.上記のコードを少し処理すれば、この問題を解決できます.
function Person(name){

    this.name = name;

}

Person.prototype.getname = function(){

    return this.name;

}



function Bloger(name,blog){

    Person.call(this,name);

    this.blog = blog;

}

/*         */

Bloger.prototype = new Person();   

Bloger.prototype.constructor = Bloger;



var bloger = new Bloger("zhenn","http://www.men-ideal.com");

alert(bloger.name=="zhenn");   /*  ture*/

alert(bloger.blog)   /*  http://www.men-ideal.com*/

alert(bloger.getname()=="zhenn");   /*  true*/

ここではこの2行のコードについて説明したいのですが、各コンストラクタにはプロトタイプ属性があり、この属性はこのコンストラクタのプロトタイプオブジェクトを指しています.プロトタイプオブジェクトもインスタンスオブジェクトです.プロトタイプオブジェクトで定義された属性と方法はすべてのインスタンスオブジェクトに共有されます.2行のコードを新たに追加する意図は、サブクラスのプロトタイプのオブジェクトを親クラスの1つのインスタンスオブジェクトに向けることです.そして、親類のプロトタイプの方法をすべて引き継ぎます.このようにして、私たちの目的を達成します.サブタイプのプロトタイプは、すべての親タイプのインスタンスオブジェクトが持つ属性と方法を継承します.
しかし、Bloger.prototype.com nstructor=Blogerに注意すべきです.このラインコードは、子タイプのプロトタイプを親タイプのインスタンスとして設定すると、そのconstructor属性が親タイプを指しますので、サブタイプのプロトタイプのconstructorを設定して、サブクラスを再び指します.これで、javascriptのクラス継承が完璧に実現しました.
サブクラスの声明を簡略化するために、拡張子クラスのプロセス全体をextedという関数に書くことができます.作用は与えられたクラス構造に基づいて新しいクラスを作成します.
function extend(childClass,parentClass){

    var F = new Function();

    F.prototype = parentClass.prototype;

    childClass.prototype = new F();

    childClass.prototype.constructor = childClass;

}

このextedという関数があれば、とても便利な拡張子類ができます.この関数を呼び出すだけでいいです.上記に追加した2行のコードはexted(Bloger、Person)に変更できます.同様に完全な継承が可能です.