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;
}
}( ) );