JS继承方式

JS继承的方式

构造继承

基本思想:

经过使用call,apply方法能够在新建立的对象上执行构造函数,用弗雷的构造函数来增长子类的实例javascript

优势:简单明了,直接继承超类构造函数的属性和方法java

缺点:没法继承原型链上的属性和方法app

【约定】:函数

// 父类
function Super(){
  this.property = 'Super Property'
}
Super.prototype.getProperty = function(){
  return this.property
}

  

// 子类
function Sub(){
  Super.call(this)
  this.property = 'Sub Property'
}

  

原型链继承

基本思想:

利用原型链来实现继承,超类的一个实例做为子类的原型this

  

// 子类
function Sub(){
  this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意这里new Super()生成的超类对象并无constructor属性,故需添加上
Sub.prototype.constructor = Sub

  

优势:简单明了容易实现。实例是子类的实例,实际上也是父类的一个实例。父类新增原型方法属性,子类都能继承访问prototype

缺点:全部子类的实例的原型都共享同一个超类实例的属性和方法对象

没法实现多继承blog

组合继承

基本思想

利用构造函数和原型链组合继承

// 子类
function Sub(){
  Super.call(this)
  this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意这里new Super()生成的超类对象并无constructor属性,故需添加上
Sub.prototype.constructor = Sub

  

优势:解决了构造继承和原型链继承的两个问题ip

缺点:实际上子类会拥有超类的两份属性,只是子类的属性覆盖了超类的属性

原型式继承

基本思想

采用原型式继承并不须要定义一个类,传入参数obj生成一个继承obj对象的对象

function objectCreate(obj){
  function F(){}
  F.prototype = obj
  return new F()
}

  

优势:直接经过对象生成一个继承该对象的对象

缺点:不是类式继承,而是原型式基础,缺乏了类的概念

相关文章
相关标签/搜索