总结 js继承的几种方式

333 阅读2分钟

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,说明实现了继承。

  1. 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,实现继承。
  1. 利用空对象作为中介
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种会修改父类原型的问题。