/*对象之间继承的五种方法*/
//如 ,现在又一个“动物"对象的构造函数
function Animal(){
this.species = "动物";
}
//"猫"对象的构造函数
function Cat(name,color){
this.name = name;
this.color = color;
}
//如何才能让“猫”继承“动物”了 下面介绍了五种方法
/* 1. 使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象函数中加一行
function Cat(name,color){
Animal.apply(this,arguments);
this.name = name;
this.color = color;
}
var cat1 = new Cat("大毛","黄色");
alert(cat1.species); //动物
*/
/*
2.prototype模式
如果“猫”的prototype对象,指向一个Animal的实例,那么所有“猫”的实例,就能继承Animal了
*/
Cat.prototype = new Animal(); //相当于完全删除了prototype对象原先的值,,然后赋予一个新值
Cat.prototype.constructor = Cat; //任何一个prototype对象都有一个constructor属性,指向它的构造函数,如果没有"Cat.prototyep=new Animal();"这一行, Cat.Prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor是指向Cat的,加了这一行以后,Cat.prototype.constructor指向Animal
var cat1 = new Cat("大毛","黄色");
// alert(cat1.species); //动物
alert(Cat.prototype.constructor == Animal); //false
alert(cat1.constructor == Cat.prototype.constructor);
/*3.直接继承prototype
第三种方法是对第二种方法的改进。由于Animal对象中,不变的属性都可以直接写入Animal.prototype,所以,我们也可以让Cat()跳过Animal(),直接继承Animal.prototype
function Animal(){}
Animal.prototype.species = "动物";
//然后,将Cat的prototype对象指向Animal的prototype的对象,这样就完成了继承
Cat.prototype = Animal.prototype;
Cat.prototype.constructor = Cat;
var cat1 = new Cat("大毛","黄色");
alert(cat1.species);//动物
//与前一种方法相比,这样做的有点就是效率比较高(不用执行和建立Animal的实例了),比较省内存.缺点是Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype,所以,上面这一段代码其实是有问题的.请看第二行 Cat.prototype.constructor = Cat;这一句实际上把Animal.prototype对象的constructor属性也改掉了
*/
/*4利用空对象作为中介
由于直接继承prototype存在上述的缺点,所以就有第四种方法,利用一个空对象作为中介。
var F = function(){};
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat;
//F是空对象,所以几乎不占内存,这时,修改Cat的prototype对象,就不会影响到Animal的prototype对象.
alert(Animal.prototype.constructor);//Animal
//将上面的方法,封装成一个函数,便于使用
function extend(Child,Parent){
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype=new F();
Child.prototype.constructor=Child;
Child.uber = Parent.prototype;
}
//使用方法如下
extend(Cat,Animal);
var cat1 = new Cat("大毛","黄色");
alert(cat1.species);//动物
*/
/*5.拷贝继承
上面是采用prototype对象,实现继承。我们也可以换一种思路,纯粹采用“拷贝”方法实现继承,简单说,如果把父对象的所有属性和方法,拷贝进子对象,不也能够实现继承码,这样我们就有了第五种方法
*/
//首先,还是把Animal的所有不变属性,都放到他的prototype对象上.
function Animal(){}
Animal.prototype.species= "动物";
function extend2(Child,Parent){
var p = Parent.prototype;
var c = Child.prototype;
for(var i in p){
c[i] = p[i];
}
c.uber = p;
}
//使用的时候,这样写:
extend2(Cat, Animal);
var cat1 = new Cat("大毛","黄色");
alert(cat1.species); // 动物