// 将原型继承和非原型继承组合为一体的继承方式叫做组合继承,但是这种方法的继承是有一点小缺陷的,下级函数继承了无用的属性,所以我们有了寄生继承来解决污染问题;
//创建上级构造函数-食物
function Food(name, hot, taste){
this.name = name;
this.hot = hot;
this.taste = taste;
}
//为了清楚的注释过程,我们分开写上级构造函数的原型方法-变质
Food.prototype.bad = function(){
console.log("保质期3天");
};
//创建下级构造函数-面包
function Bread(name, hot, taste, brand){
//这里是借用上级函数的静态属性,也叫非原型继承
Food.apply(this, arguments);
//自己的属性
this.brand = brand;
}
//创建一个空的函数
var fn = function(){};
//将空函数原型替换为上层函数的原型,这样的空函数没有了私有属性,而且原型吃的还是人家的是不是和寄生虫一样呢?
fn.prototype = Food.prototype;
//使用空函数实例赋值给下级函数原型,这样有回到了我们的原型继承,这次继承的是fn的原型,很干净
Bread.prototype = new fn();
//当然还原constructor还是必须的,但是这里不能写 read.constructor = Bread 因为Bread.constructor是 Function () {};
Bread.prototype.constructor = Bread;
//下面创建下级函数自己的原型方法,值得注意的是扩展自身原型之前完成继承,不然会有覆盖问题
Bread.prototype.dry = function(){
console.log("一天不吃咬不动了!");
}
//下面我们可以有下级元素创建实例测试了
var bread = new Bread("脏脏包", "1000k", "sweet", "golden phinex");