在前面学习的是js的面向对象中数据的封装。类方法和原型方法的一些区别,所以现在是面向对象的继承的几种方法:
有一个动物对象的构造函数
function Animal() { this.species = "动物"; }
有一个猫对象的构造函数
function Cat(name,color) { this.name = name; this.color = color; }
如何使猫继承动物呢
一:构造函数的绑定
使用call或者apply方法,将对象的构造函数绑定在子对象上,即在子对象的构造函数中加一行
function Cat(name,color) { Animal.apply(this, arguments); this.name = name; this.color = color; } var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物
使用prototype属性,如果猫的prototype对象,指向一个Animal的实例,那么所有猫的实例就能继承Animal了。
Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物
下面是解释
//这一行是讲Cat的prototype对象指向Animal的一个实例,相当于将新值覆盖了了原来的值 Cat.prototype = new Animal();
任何一个prototype对象都有一个constructor属性,指向他的构造函数。如果没有“Cat.prototype = new Animal();”Cat.prototype.constructor是指向Cat 的,加了之后指向Animal
Cat.prototype.constructor = cat;
更重要的是,没一个实例都有一个constructor属性,默认调用prototype对象的constructor属性
因此在运行
Cat.prototype = new Animal()
之后,cat1.constructor也指向Animall。
三、直接继承prototype
这是第二种方法的改进,因为Animal对象中,不变的属性可以直接写入Animal。prototype中,所以我们可以直接继承Animal.prototype.
首先,将Animal改写为
function Animal(){}; Animal.prototype.species = '动物';
然后将Cat的prototype对象指向Animal的prototype,这样就完成了继承
Cat.prototype = Animal.prototype ; Cat.prototype.xonstructor = Cat ; var cat1 = new Cat('damao','haunse'); alert(cat1.species);
这种方法效率较高,比较省内存,但是Cat.prototype和Animal.prototype同时指向了同一对象,那么任何对Cat.prototype的修改都会反映到Animale.prototype。