构造函数的继承
对象继承之间的五种方法:
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();
Cat.prototype.constructor = Cat;
var Cat1 = new Cat("小王","黄色");
alert(cat1.species); // 动物
注意:如果替换了prototype对象,那么下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数。
3.直接继承prototype
由于不变的属性都可以直接写入prototype,所以直接继承Animal.prototype.
function Animal() {
Animal.prototype.species = "动物";
}
Cat.prototype = Animal.prototype;
Cat.prototype.constructor = Cat;
var Cat1 = new Cat("小王","黄色");
alert(cat1.species); // 动物
优点:相比第二种效率比较高,省内存.
缺点:Cat.prototype和Animal.prototype指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype.
alert(Animal.prototype.constructor); // Cat
4.利用空对象作为中介
var F = function() {};
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat;
alert(Animal.prototype.constructor); // Animal
将上面的方法封装成一个函数:
function extend(Child,Parent) {
var F = function() {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.protype.constructor = Child;
Child.uber = Parent.prottotype;
}
extend(Cat, Animal);
var cat1 = new Cat("小王","黄色");
alert(cat1.species); // 动物
说明:最后一行,为子对象设置一个uber属性,直接指向父对象的prototype属性。等于在子对象上打开一跳通道,可以直接调用父对象的方法。
5.拷贝继承
简单的说,把父对象所有的属性和方法,拷贝进子对象。
function Animal() {
Animal.prototype.species = "动物";
}
function entend2(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); // 动物
将父对象的prototype属性一一拷贝个Child对象的prototype属性。
参考blog:
面向对象