如果我为我的对象使用构造函数并为共享功能使用原型,我想将共享功能(函数)混合到对象的原型中,但将实例特定(this
变量)混合到对象实例中。
要添加原型部分,我发现了这种模式。为了设置原型函数假定存在的实例变量,我想出了一个 init(每个 mixin 一个)。
这是一个简单的例子:
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
在实例上调用时控制台日志记录未定义)。
所以问题是:有没有一种更简洁的方法来设置mixin函数假定存在的初始实例变量?