js之类式继承,原型继承,掺元类

类式继承

//extend function
function extend(subClass,superClass){
  var F=function(){};
  F.prototype=superClass.prototype;
  subClass.prototype=new F();
  subClass.prototype.constructor=subClass;

  subClass.superclass=superClass.prototype;
  if(superClass.prototype.constructor == Object.prototype.constructor){
    superclass.prototype.constructor = superClass;
  }
}
//class Person function Person(){   ... } //class Author function Author(){ Author.superclass.constructor.call(); } extend(Author,Person) Author.prototype.sayName=function(){ ... };

原型继承

//clone function
function clone(obj){
       var F=function(){};
       F.prototype=  obj;
       return new F();  
}

//class Person
var Person{
        name:'Byronvis',
        sayName:function(){
                  alert(this.name);
        }
}

//class Author
var Author=clone(Person);
Author.age='32';
Author.sayAge=function(){
     alert(this.age);
}

var someObj=clone(Author);
someObj.name='Elvis';
someObj.age=’23'

掺元类

//augment function
function augment(receivingClass,givingClass){
  if(arguments[2]){
    for(var i = 2,len = arguments.length;i++){
      receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
    }
  }
  else{
    for(methodName in givingClass.prototype){
      if(!receivingClass.prototype[methodName]){
        receivingClass.prototype[methodName] = givingClass.prototype[methodName];
      }
    }
  }
}

//Mixin class
var Mixin = function(){};
Mixin.prototype = {
  serialize:function(){
    var output = [];
    for(key in this){
      output.push(key + ':' + this[key]);
    }
    return output.join(',');
  }
};

augment(Author,Mixin);
原文地址:https://www.cnblogs.com/byronvis/p/4515145.html