Javascriptの関数的対象(四)マルチ親継(Multiple Inherityance)



「多親継承」とは、同じ対象言語を借用したものです.
 
以前、いくつかの文章を見ましたが、どのようにしてjsに対象言語の「継承」特性を持たせるかを紹介します.
 
しかし、実際のプロジェクトでは、これらの難解な方法を用いて「継承」の実現をシミュレートすることはめったにない.
 
jsが提唱しているのが関数式プログラミングである以上、「継承」「インターフェース」というOOの特性を忘れさせてください.
 
関数プログラミングのコード再構成法を体験して,「共通性の抽出,パッケージの変化」の目的を達成した.
 
//         ,     Printable,            print   
var Printable = function(){};
Printable.prototype = {
   print: function(){
      console.log('The instance of '+this.name+' is printable!');
   },
	
   toString: function(){
      return 'Printable';
   }
};

//     Clonable,            clone   
var Clonable = function(){};
Clonable.prototype = {
   clone: function(){
     console.log('The instance of '+this.name+' is clonable!');
   },
	
   toString: function(){
       return 'Clonable';
   }
};

//      Object  extend  ,               。
Object.prototype.extend = function(parentClass){

    var parentClassName = parentClass.prototype.toString();
    //      prototype      ,    prototype             	
    for(methodName in parentClass.prototype){ 
       //     prototype       ,            
       if(!this.prototype[methodName]){
         console.log('Copy the method '+methodName+' from class '+parentClassName);
         this.prototype[methodName] = parentClass.prototype[methodName];
       }
    }
}

//           ,   name         
var MultiInheritance = function(name){
    this.name = name;	
}; 
MultiInheritance.extend(Printable); //     Printable            
MultiInheritance.extend(Clonable); //     Clonable            

//       “Multi-Inheritance 1”       
var multiInheritance1 = new MultiInheritance('Multi-Inheritance 1');
multiInheritance1.print(); 
multiInheritance1.clone();

//       “Multi-Inheritance 2”       
var multiInheritance2 = new MultiInheritance('Multi-Inheritance 2');
multiInheritance2.print();
multiInheritance2.clone();
 
上記のコードを実行すると、ブラウザコンソールから以下の情報が出力されます.
 
Copy the method print from class Printable
Copy the method clone from class Clobale
The instance Multi-Inheitance 1 is printable!
The instance Multi-Inheitance 1 is clonable!
 
2つの注意点があります.
 
1.機能クラスPrintableとClonableの方法では、サブクラスの共通変数がthisキーワードにアクセスできます.
 
2.最上階のオブジェクトObjectのexted方法において、サブクラスに親と同名の方法がある場合、
 
「同名の方法、サブクラス優先」の原則により、サブクラスの方法はカバーされず、親タイプの方法も依然としてアクセス可能である.