YUI用寄生ユニット引き継ぎ


「寄生组合式継承」とは?
構造関数を用いて属性を継承し,プロトタイプ鎖の混成形式により方法を継承した.構造関数+プロトタイプチェーン.
寄生結合式継承は、引用タイプの最も理想的な継承モデルである.
寄生結合式継承の基本パターン
function inheritPrototype(subType, superType) {
    //    
    var prototype = Object(superType.prototype);
    //    
    prototype.constructor = subType;
    //    
    subType.prototype = prototype;
}
 
関数内部のプロセス:
第一歩、超クラスの原型のコピーを作成します.
第二のステップは、作成されたコピーにconstructorの属性を追加し、元のモデルを書き換えることによって失われたデフォルトのconstructorの属性を補います.
第3ステップは、新規に作成したオブジェクト(すなわちコピー)をサブタイプのプロトタイプに割り当てます.
実例
function SuperType(name) {
    this.name = name;
    this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
    alert(this.name);
};

function SubType(name, age) {
    SuperType.call(this, name);
    this.age = age;
}
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function() {
    alert(this.age);
};
 
YUIの寄生ユニット式継承
//  
function extend(subClass,superClass){
    var F = function(){};
    F.prototype = superClass.prototype;
    subClass.prototype = new F(); //         ,                          
    subClass.prototype.constructor = subClass;  //  constructor  superClass,     subClass  

    subClass.superclass = superClass.prototype;//                    
    if(superClass.prototype.constructor == Object.prototype.constructor) {//           Object,         
        superClass.prototype.constructor = superClass;
    }
}
//  
function Person(name) {
    this.name = name;
}
Person.prototype.sayName = function() {
    alert(this.name);
};
function Chinese(name,job) {
    Person.call(this, name);
    this.job = job;
}

extend(Chinese, Person);

Chinese.prototype.sayJob = function() {
    alert(this.job);
};

var c = new Chinese("MirrorAvatar", "coder");
alert(c.sayName());  //MirrorAvatar
 
参考資料:
  • 「JavaScript高級プログラム設計」
  • JSタイプは
  • を継承します.