首页 > 试题广场 >

JS中继承实现的几种方式,

[问答题]

JS中继承实现的几种方式,

function Person(){
    this.name='小明'
    this.getName=function () {
        console.log(this.name)
    }
}
Person.prototype.get = () => {
    console.log('原型链上的方法')
}

  1. 原型链继承 
        父类的实例作为子类的原型
        优点:父类方法可以复用  缺点:①父类所有引用类型会被子类共享,修改一个子类数据其他子类数据会受影响 ②子类实例不能给构造函数传参
function Student(){}
Student.prototype = new Person();
    2.构造函数继承
        复制父类的属性和方法,call可以实现多继承
        优点:父类引用类型数据不会被子类共享互不影响  缺点:①子类不能访问父类原型上的方法、参数
function Student(){
    Person.call(this);
}
    3.组合继承
        优点:①父类可以复用 ②父类所有引用类型不会被子类共享 缺点:会有两份一样的属性和方法,影响性能
function Student(){
    Person.call(this);
}
Student.prototype = new Person();
    4.寄生组合继承
        (ES5最优)
function Student(){
    Person.call(this);
}
const Fn = function () {};
Fn.prototype = Person.prototype;
Student.prototype = new Fn();
    5.ES6 extends
class Student extends Person{};




编辑于 2022-06-24 18:42:18 回复(0)
1 原型链继承:将父类的实例作为子类的原型,特点是实例是子类的实例也是父类的实例,父类新增的原型方法/属性,子类都能够访问,并且原型链继承简单易于实现,缺点是来自原型对象的所有属性被所有实例共享,无法实现多继承,无法向父类的构造函数传参。
2 构造继承,使用父类的构造函数来增强子类的性能,即复制父类的实例属性给子类。构造继承可以向父类传递参数,可以实现多继承,通过call多个父类对象。但是构造继承只能继承父类的实例属性和方法,不能继承原型属性和方法,无法实现函数复用,每个子类都有父类实例函数的副本,影响性能。
3 实例继承:为父类实例添加新特性,作为子类实例返回,实例继承的特点是不限制调用方法,不管是new子类()还是子类()返回的对象具有相同的效果,缺点是实例是父类的实例,不是子类的实例,不支持多继承。
发表于 2020-07-23 17:00:38 回复(0)