继承发展史
1、传统模式 – 原型链
继承了过多没用的属性
2、call/apply借用构造函数
不能继承借用构造函数的原型;
每次构造函数要多走一个函数。
3、共享原型
Father.prototype.lastName = "GT";
function Father(){ }
function Son(){ }
Son.prototype = Father.prototype
var son = new Son();
var father = new Father();
1)封装一个用于继承的函数
参数传的是构造函数,我们不是让单独一个对象取继承东西(直接改对象的__proto__就好啦),而是让构造函数的prototype去继承,那么它生产出来的对象全都继承了该原型。
function inherit(Target,Origin){
Target.prototype = Origin.prototype;
}
inherit(Son,Father); --> 先继承 后调用
var son = new Son();
上面的封装函数中,继承与被继承的两个构造函数的原型指向同一个房间,继承者无法实现私有个性化地给自己的原型增删改。因此下面需要完善这个方法。
2)圣杯模式
function inherit(Target,Origin){
function F(){};
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target; --> 构造函数归位
Target.prototype.uber = Origin.prototype; -->真正继承的超类
}
3)圣杯模式优化
再进一步优化,利用立即执行函数以及闭包实现私有化应用
var inherit = (function(){
var F = function(){};
return function(Target,Origin){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype.uber = Origin;
}
}());