1.构造函数绑定
function Cat(name,color){
this.name=name;// this 指向它的实例
this.color=color;
}
// 实例化 new
var cat1 = new Cat("大毛","黄色");
var cat2 = new Cat("二毛","黑色");
Cat 是一个大的猫类,我们可以实例化出cat1,cat2...实现继承。
测试一下,cat1和cat2的关系,以及他们与Cat的关系。
console.log(cat1.constructor == cat2.constructor);// 构造函数
console.log(cat1 instanceof Cat);
console.log(cat2 instanceof Cat);
他们都会返回true,说明实现了继承。
- prototype模式:可以通过原型对象的方式给Cat添加一个方法
function Cat(name,color){
this.name=name;// this 指向它的实例
this.color=color;
}
Cat.prototype.eat = function(){
console.log("老鼠");
}
Cat.prototype.type="猫科动物";
var cat1 = new Cat("大毛","黄色");
cat1.eat(); //会执行上面的函数,输出:老鼠
3.直接继承prototype
function Animal(name){
this.name=name;
this.species = "动物";
}
function Cat(name,color){
Animal.call(this,name,color);
this.name=name;
this.color=color;
}
var cat1 = new Cat("大毛","黄色")
console.log(cat1.species);
- 通过call()方法,可以使用另一个对象的方法。 上面的代码就是通过call()将Animal里的属性带入Cat,实现继承。
- 利用空对象作为中介
function Animal(){
}
Animal.prototype.species='动物'
function Cat(name,color){
this.name=name;
this.color=color
}
var F =function(){} //空的构造函数 也是空对象
F.prototype =Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor =Cat;
var cat1 = new Cat('小花','白色')
console.log(Animal.prototype.constructor);//[Function: Animal]
console.log(cat1.species);//动物
-
以上一共是四种继承方式,那用哪一种效率更高呢?它们有什么优缺点呢?
第1种构造函数的绑定缺少了灵活性,不能在子类随意的添加属性方法。
第2种和第3种相比,3是直接继承prototype,其优点是效率比较高,不需要执行和建立父元素的实例。但缺点是Cat.prototype和Animal.prototype指向同一个对象。会改变父类的原型对象。
而第4种解决了2和3的这个缺点。而且创建一个空对象并不会占很多内存,也解决了第2种的效率问题,也没有第3种会修改父类原型的问题。