JavaScriptに基づいて、継承メカニズムの原型チェーンの詳細を実現します.

2130 ワード

前の例のクラスをプロトタイプで再定義すると、次のようになります.
 
  
function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();

プロトタイプの不思議なところは最後の行のコードです.ここで、クラスBのprototype属性をクラスAの例に設定します.これはとても面白いです.クラスAのすべての属性と方法がほしいですが、クラスBのプロトタイプ属性に一つずつ追加したくないです.クラスAのインスタンスをprototype属性に与えるより良い方法がありますか?
注意:Class Aの構造関数を呼び出して、パラメータを伝えませんでした.これはプロトタイプチェーンにおいて標準的なやり方である.コンストラクタにはパラメータがないことを確認します.
対象と偽るのは似ていますが、サブクラスのすべての属性と方法はプロトタイプ属性が付与された後に現れなければなりません.その前に与えられた値のすべての方法が削除されますから.なぜですか?プロトタイプの属性が新しいオブジェクトに置き換えられているため、新しい方法を追加した元のオブジェクトは破棄されます.したがって、クラスBにname属性とsayName()方法のコードを追加します.
 
  
function ClassB() {
}

ClassB.prototype = new ClassA();

ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
    alert(this.name);
};

このコードは下記の例を実行してテストできます.
 
  
var objA = new ClassA();
var objB = new ClassB();
objA.color = "blue";
objB.color = "red";
objB.name = "John";
objA.sayColor();
objB.sayColor();
objB.sayName();
また、プロトタイプチェーンでは、instance of演算子の動きも独特です.クラスBのすべての例に対して、instance ofはクラスAとクラスBのためにtrueに戻ります.たとえば:
 
  
var objB = new ClassB();
alert(objB instanceof ClassA);    // "true"
alert(objB instanceof ClassB);    // "true"
ECMAScriptの弱いタイプの世界では極めて有用なツールですが、対象を偽った場合はこの方法で判断することはできません.しかし、サブタイプのプロトタイプは直接に再割り当てされているので、以下のような場合があります.
 
  
console.log(objB.__proto__===objB.constructor.prototype)   //false
クラスBのプロトタイプタイプ属性は他のクラスのオブジェクトに書き換えられました.アウトプットの結果、objB._u uプロト.依然としてClass B.prototypeを指しています.objb.com nstructor.prototypeではありません.これもよく理解されている.Person.prototypeに値を割り当てるのはオブジェクト直接量new Class Aの例であり、オブジェクト直接量方式で定義されたオブジェクトを使用して、そのコンストラクタはルートコンストラクタObject、Object.prototypeは空のオブジェクトであり、{}自然とClass B.prototypeとは異なる.