函数化实现“伪继承机制”
步骤:
1.创建一个新对象
2.有选择性的定义私有变量和方法,就是函数中通过var声明的普通变量
3.给这个新对象扩充方法
4.返回这个新对象
原理:在继承的时候,在子类中首先获得父类定义的新对象,之后在这个新对象的基础上扩充其他的方法或者重定义父类的方法.
从而达到始终都在操作同一个对象来实现“伪继承”。
Function.prototype.method=function(name,fn){
if(!this.prototype[name]){
this.prototype[name]=fn;
}
return this;
}
var mammal = function(spec){
var that = {}; //创建一个新对象
//给新对象扩充方法
that.get_name = function(){
return spec.name;
};
that.says = function(){
return spec.saying || "";
};
//返回这个新对象
return that;
}
var cat=function(spec){
spec.saying=spec.saying || meow ;
//调用mammal方法,获得它生成的对象
var that=mammal(spec);
//在mammal方法返回的对象基础上扩展方法
that.purr=function(n){
var i,s="";
for(i=0;i<n;i++){
if(s){
s+="-";
}
s+="r";
}
return s;
};
//重定义get_name方法
that.get_name=function(){
return that.says()+" "+spec.name +" "+that.says();
}
//返回扩展后的对象
return that;
}
//Object扩展方法superior,通过参数名称访问父类方法
Object.method( superior ,function(name){
var that=this,method=that[name];
return function(){
return method.apply(that,arguments);
}
});
var coolcat=function(spec){
var that=cat(spec);
var super_get_name=that.superior( get_name ); //获得父类的get_name方法的引用
//重定义get_name方法
that.get_name=function(n){
return Like +super_get_name()+" baby,"+n;
};
//返回扩展后的对象
return that;
}
var myCoolCat=coolcat({name:"Bix"});
alert(myCoolCat.get_name("supersha"));