Javascriptの関数的対象(四)マルチ親継(Multiple Inherityance)
2738 ワード
「多親継承」とは、同じ対象言語を借用したものです.
以前、いくつかの文章を見ましたが、どのようにして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方法において、サブクラスに親と同名の方法がある場合、
「同名の方法、サブクラス優先」の原則により、サブクラスの方法はカバーされず、親タイプの方法も依然としてアクセス可能である.