1  传统形式 —-> 原型链
可能会继承了没用的属性
2  借用构造函数
借用的是构造函数的方法  不能借用构造函数的原型
且每次构造函数都要多走一个函数
如
function Student(name,age,grade){
Person.call(this,name,age);
this.grade = grade;
}
//即这里Student借用Person的构造函数
//但是原型还是Student.prototype  并没有把Person的原型借来
3  共享原型
多个函数共享一个原型
但不能随便改动自己的原型
如
function Person(){}
function Son(){}
function inherit(Target,Origin){
Target.prototype = Origin.prototype;
}
inherit(Son,Person);
//此时Son与Person共享Person.prototype原型
//此时Son的原型改变也会导致Person原型的改变
4  圣杯模式
经过对共享原型的优化  使其即使改动过了自己的原型  也不会影响共享原型
如
function inherit(Target,Origin){
function F(){}
//F起到中间人的作用
F.prototype = Origin.prototype;
//F与Origin共享原型
Target.prototype = new F();
//这里Target的原型是F  而F的原型才是Origin  这里有两层关系
//所以即使某一边的原型发生改变  也不会影响其他的原型
Target.prototype.contructor = Target;
//这里本来  Target.proto  —->  new F( ) 但F中没有构造方法  —->  Origin.prototype
//所以我们需要人为的修改其所对应的contructor
Target.prototype.uber = Origin.prototype;
//这步可有可无  是为了方便找到自己的超类  即知道自己真正继承自谁
}
inherit(Son,Person);
也可以这么写:
var inherit = (function () {
var F = function(){};
//属性私有化
return function(Target,Origin){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.contructor = Target;
Target.prototype.uber = Origin.prototype;
}
}( ) );
