函数化实现“伪继承机制”

步骤:
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"));