js继承方式

类式继承

function SuperClass(){
  this.superValue = 'superValue';
  this.langs = ['js','html'];
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(){
  this.subValue = 'subValue';
}

SubClass.prototype = new SuperClass(); 
SubClass.prototype.getSubValue = function(){
  return this.subValue;
}

缺点:   1.父类构造函数中的引用类型会被子类实例共享
        2.子类实例化过程中不能将参数传给父类构造函数

构造函数继承

function SuperClass(name){
  this.superValue = 'superValue';
  this.langs = ['js','html'];
  this.name = name || 'super';
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(name){
  this.subValue = 'subValue';
  SuperClass.call(this,name);
}

SubClass.prototype.getSubValue = function(){
  return this.subValue;
}
优点: 子类实例化过程中可传参给父类构造函数
缺点: 子类不能继承到父类prototype上的属性

组合继承

类式继承 + 构造函数继承

function SuperClass(name){
  this.superValue = 'superValue';
  this.langs = ['js','html'];
  this.name = name || 'super';
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(name){
  this.subValue = 'subValue';
  SuperClass.call(this,name);
}

SubClass.prototype = new SuperClass(); 
SubClass.prototype.getSubValue = function(){
  return this.subValue;
}

优点: 1.子类实例中更改继承的引用类型不会影响到其他子类实例
      2.子类实例化过程中能将参数传递给父类的构造函数

缺点: 子类继承会调用两次父类构造函数(prototype和call)
   

原型式继承

function inheritObject(o){
  function F(){}
  F.prototype = o;
  return new F();
}
---
var book = {
  name:'langs'
  content:['js','html']
}
var newBook = inheritObject(book);

类似于类式继承
缺点:同类式继承
优点:可根据已有对象创建新对象,不必创建自定义的类

寄生式继承

 var book = {
  name:'langs'
  content:['js','html']
}

function createBook(o){
  var obj =  inheritObject(o);
    //扩展新对象
    obj.getName = function(){
    console.log('name');
  }
  return obj;
}
在原型式继承的基础上扩展属性
优缺点同原型式继承

寄生组合式继承

寄生式继承 + 构造函数继承


function inheritPrototype(subClass,superClass){
  var p = inheritObject(superClass);
  p.constructor = subClass;
  subClass.prototype = p;
}

function SuperClass(value){
  this.superValue = value || 'superValue';
  this.langs = ['js','html'];
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(value){
  SuperClass.call(this, value);
}
inheritPrototype(SubClass, SuperClass);
优点:1.子类实例中更改继承的引用类型不会影响到其他子类实例
      2.子类实例化过程中可传参给父类构造函数
缺点:代码实现复杂
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 借用构造函数继承 原型链式继承(借用原型链实现继承) 组合式继承 组合式继承优化1 组合式继承优化2 ES6中继承...
    lxt410725阅读 2,540评论 0 1
  • 一.原型链继承 原型链继承主要是通过修改原型中的prototype的指向,从而继承上级构造函数的公有属性 两构造函...
    锤子爱砸房子阅读 4,763评论 0 0
  • 我们在对象创建模式中讨论过,对象创建的模式就是定义对象模板的方式。有了模板以后,我们就可以轻松地创建多个结构相同的...
    csRyan阅读 4,427评论 0 7
  • 1.继承(接口继承和实现继承) 继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式...
    believedream阅读 4,547评论 0 3
  • 训练前请再确认以下几点: 1、每周训练4天,每次训练1小时左右; 2、重量选择6~10RM的偏大负重,每组必须做到...
    熊大状阅读 3,440评论 0 0

友情链接更多精彩内容