オブジェクトにコンストラクター関数を使用し、共有機能にプロトタイプを使用する場合、共有機能 (関数) をオブジェクトのプロトタイプにミックスインしますが、オブジェクト インスタンスに固有のインスタンス (this
変数) をミックスインします。
プロトタイプ部分を追加するには、このパターンを見つけました。プロトタイプ関数によってそこにあると想定されるインスタンス変数を設定するために、私は init (ミックスインごとに 1 つ) を考え出しました。
簡単な例を次に示します。
var mixIn=function(target,source){
for(fn in source){
if(source.hasOwnProperty(fn)){
target.prototype[fn]=source[fn];
}
}
};
var SpeakEnable = {
say:function(){
console.log(this.message);
},
initSpeak:function(){// for initializing instance vars
this.message="Hello World Mixed in!";
this.object=[];
}
};
var Person=function(){
this.initSpeak();//have to init instance vars
};
// set up inheritance
// set up Person.prototype
// set speak enable
mixIn(Person,SpeakEnable);
var lulu=new Person();
lulu.say();
var june=new Person();
console.log(june.say===lulu.say);//true
console.log(june.object===lulu.object);//false
これはすべてうまく機能しますが、インスタンス変数の初期化に問題があります。どういうわけか、あまりきれいな方法ではないようです。複数の mixin を混在させる場合、Person コンストラクター関数はすべての init 関数を呼び出してインスタンス変数を設定する必要があります。それを呼び出すのを忘れると、おかしなエラーが発生します (この場合say
、インスタンスで が呼び出されたときに未定義のコンソール ログが記録されます)。
問題は、ミックスイン関数によってそこにあると想定される初期インスタンス変数をセットアップするためのよりクリーンな方法はありますか?