js继承的几种方法
    JavaScript泛应用于网页开发,它提供了面向对象的编程思想,从而使开发者可以定义自己的类型,并且可以进行继承,以简化复杂的开发程序。JavaScript持多种继承方式,比较常见的有原型链继承、构造函数继承、组合继承以及实例式继承等。
    一、原型链继承
    原型链继承是 JavaScript持的最常用继承方式,它使用原型链的概念,将子类的原型(prototype)指向父类的实例,这样就能够实现继承。即子类继承自父类的原型链,而不是实例,从而为子类提供了共享父类原型方法和属性的特性。下面是一个典型的实现原型链继承的例子:
    function Father(name){
    this.name = name;
    }
    Father.prototype.sayName = function(){
    console.log(My name is  + this.name);
    }
    function Son(name, age){
    Father.call(this, name);
    this.age = age;
    }
    Son.prototype = new Father();
    structor = Son;
    Son.prototype.sayAge = function(){
    console.log(My age is  + this.age);
    }
    var son = new Son(zhangsan 20);
    son.sayName();  //My name is zhangsan
    son.sayAge();  //My age is 20
js原型和原型链的理解    以上代码中,我们可以看到,子类Son父类Father实例作为其原型,并且重新指定其构造函数,来实现子类的实例具有父类的所有原型方法及属性,并且可以定义新的子类原型方法。
    原型链继承的优点是实现简单,不用生成超类的实例,只需简单的将子类的原型指向父类的实例即可完成继承,另外一个优点是可以实现多级继承,也就是说父类也可以继承自另外一个父类,从而可以实现多级继承,在特定场合下非常有用。但它也有一些缺点,由于原型链的弊端,它创建的实例无法向父类构造函数传递参数,对于实例属性的添加也相对较难,而且原型的引用属性会被所有实例共享,也就是说原型链继承法只能实现共享变量的继承,而不能实现实例变量的继承。
    二、构造函数继承
    构造函数继承是 JavaScript发社区最为推崇的继承方式,它也是最常用的继承方式,它的基本思想是在子类构造函数中调用父类构造函数,从而实现对父类的实例属性或方法的继承,这样就可以在不改变原有继承关系的基础上,实现拓展原有类的功能。下面是一个典型的实现构造函数继承的例子:
    function Father(name){
    this.name = name;
    }
    Father.prototype.sayName = function(){
    console.log(My name is  + this.name);
    }
    function Son(name, age){
    Father.call(this, name);
    this.age = age;
    }
    var son = new Son(zhangsan 20);
    son.sayName();  //My name is zhangsan
    以上代码中,可以看到,子类Son构造函数中调用了父类Father构造函数,从而可以继承了父类的属性,也可以在子类中添加新的属性,从而实现了实例变量的继承,同时,也可以实现子类和父类实例的间接转换,这样也可以实现多态特性。
    构造函数继承在继承父类实例属性和方法的同时,还可以实现拓展新的属性和方法,同时也可以实现多态特性,这样继承的方式就比较灵活了。但是构造函数继承的缺点也是很明显的,比如它无法很容易实现多级继承,因为它每次调用父类构造函数,都会将父类对象上的属性或者方法覆盖掉,这就使得很难实现多级继承,另外一个缺点是因为重写父类构造函数,
父类的原型属性或方法就无法继承,所以在实际使用的时候,构造函数继承无法很好的替换原型链继承,有时候可以进行联合使用,从而可以使用原型链继承实现多态特性的拓展。
    三、组合继承
    组合继承是 JavaScript常用的继承方式,它是结合了原型链继承和构造函数继承的一种继承方式,即在子类构造函数中调用父类构造函数来继承父类的属性,又让子类的原型(prototype)指向父类的实例来继承父类的原型方法和属性。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。