JS继承方式
JS继承的方式
构造继承
基本思想:
通过使用call,apply方法可以在新创建的对象上执行构造函数,用弗雷的构造函数来增加子类的实例
优点:简单明了,直接继承超类构造函数的属性和方法
缺点:无法继承原型链上的属性和方法
【约定】:
// 父类 function Super(){ this.property = 'Super Property' } Super.prototype.getProperty = function(){ return this.property }
// 子类 function Sub(){ Super.call(this) this.property = 'Sub Property' }
原型链继承
基本思想:
利用原型链来实现继承,超类的一个实例作为子类的原型
// 子类 function Sub(){ this.property = 'Sub Property' } Sub.prototype = new Super() // 注意这里new Super()生成的超类对象并没有constructor属性,故需添加上 Sub.prototype.constructor = Sub
优点:简单明了容易实现。实例是子类的实例,实际上也是父类的一个实例。父类新增原型方法属性,子类都能继承访问
缺点:所有子类的实例的原型都共享同一个超类实例的属性和方法
无法实现多继承
组合继承
基本思想
利用构造函数和原型链组合
// 子类 function Sub(){ Super.call(this) this.property = 'Sub Property' } Sub.prototype = new Super() // 注意这里new Super()生成的超类对象并没有constructor属性,故需添加上 Sub.prototype.constructor = Sub
优点:解决了构造继承和原型链继承的两个问题
缺点:实际上子类会拥有超类的两份属性,只是子类的属性覆盖了超类的属性
原型式继承
基本思想
采用原型式继承并不需要定义一个类,传入参数obj生成一个继承obj对象的对象
function objectCreate(obj){ function F(){} F.prototype = obj return new F() }
优点:直接通过对象生成一个继承该对象的对象
缺点:不是类式继承,而是原型式基础,缺少了类的概念