1.原型链

  • 实现的本质是重写原型对象,代之以一个新类型的实例;
  • 给原型添加方法的代码一定放在替换原型的语句之后;
  • 不能使用对象字面量查收能见原型方法,这样会重写原型链。
  • 缺点:包含引用类型值的原型属性会被所有实例共享;在创建子类型时,不能向超类型的构造函数中传递参数。

2.借用构造函数

  • 在子类型构造函数的内部调用超类型构造函数;
  • 可以在子类型构造函数中向超类型构造函数传递参数;
  • 缺点:方法都在构造函数中定义,无法函数复用,且在超类型的原型中定义的方法对子类型不可见的。

3.组合继承

  • 使用原型链实现对原型属性和方法的继承,借用构造函数实现对实例属性的继承;
  • 缺点:无论什么情况下都会调用两次超类型构造函数(一次在查收能见子类型原型时,一次是在子类型构造函数内部)
  • function Parent(name) {
    this.name = name;
    this.arr = [1, 2, 3];
    }
    Parent.prototype.sayName = function(){
    console.log(this.name);
    };
    function Child(name, age) {
    Parent.call(this, name); // 第二次调用Parent
    this.age = age;
    }
    Child.prototype = new Parent(); // 第一次调用Parent
    Child.prototype.constructor = Child;
    Child.prototype.sayAge = function() {
    console.log(this.age);
    };
    var a = new Child('cc', 20);

4.原型式继承

  • Object.create()规范了原型式继承,可以接收两个参数(用作新对象原型的对象,为新对象定义额外属性的对象);
  • 缺点:包含引用类型值的属性始终会共享相应的值。

5.寄生式继承

  • 创建一个仅用于封装继承过程的函数,在函数内部增强对象,最后返回对象;
  • 缺点:不能函数复用而降低效率。

6.寄生组合式继承

  • 通过借用构造函数继承属性,通过原型链继承方法;
  • 不必为了指定子类型的原型调用超类型的构造函数,我们只需要超类型原型的一个副本即可;使用寄生式继承来继承超类型原型,再将结果指定给子类型原型;
  • 只调用了一次超类型构造函数。
  • function inheritPrototype(child, parent) {
    var prototype = Object.create(parent.prototype);
    prototype.constructor = child;
    child.prototype = prototype;
    }
    function Parent(name) {
    this.name = name;
    this.arr = [1, 2, 3];
    }
    Parent.prototype.sayName = function(){
    console.log(this.name);
    };
    function Child(name, age) {
    Parent.call(this, name);
    this.age = age;
    }
    inheritPrototype(Chid, Parent);
    Child.prototype.sayAge = function() {
    console.log(this.age);
    };
    var a = new Child('cc', 20);

--摘自《javascript高级程序设计》

补充(es6中的继承):

class Sup{
constructor(x, y) {
this.x= x;
this.y=y;
}
toString() {
return this.x+' '+this.y;
}
} class Sub extends Sup {
constructor(x, y, color) {
super(x, y); // 调用父类的constructor(x, y)
this.color = color;
}
toString() {
return this.color + ' ' + super.toString(); // 调用父类的toString()
}
}

js继承方式的更多相关文章

  1. JS继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...

  2. 经典面试题:js继承方式下

    上一篇讲解了构造函数的继承方式,今天来讲非构造函数的继承模式. 一.object()方法 json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点. fu ...

  3. js继承方式及特征

    1. 原型链继承 (原型链) function Parent() { this.fruits = ['apple', 'orange']; } Parent.prototype.sayHello = ...

  4. 经典面试题:js继承方式上

    js不是传统的面向对象语言,那么他是怎么实现继承的呢?由于js是基于原型链实现的面向对象,所以js主要通过原型链查找来实现继承,主要有两大类实现方式,分为基于构造函数的继承,以及非构造函数的继承. 由 ...

  5. js继承方式及其优缺点?

    原型链继承的缺点一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数.借用构造函数(类式继承)借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起.所以我们需要 ...

  6. js 中继承方式小谈

    题外话 前段时间面试中笔试题有这道题目: 请实现一个继承链,要求如下: 构造函数A():构造函数中有consoleA方法,可以实现console.log("a") 实例对象 a:a ...

  7. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  8. 重新理解JS的6种继承方式

    写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...

  9. js两种定义函数、继承方式及区别

    一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...

随机推荐

  1. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  2. Windows 2008 - 由于管理员设置的策略,该磁盘处于脱机状态

    http://blog.sina.com.cn/s/blog_59cc90640102x8m4.html 查看原文:https://www.bxl.me/9279.html准备使用云主机挂机的时候呢出 ...

  3. python描述符理解

    Python中的描述符是一个相对底层的概念 descriptor Any object which defines the methods get(), set(), or delete(). Whe ...

  4. Swift3中函数的使用

    前言:前不久,Swift语言也更新到了3.0版本,对编程有一定基础的朋友一定不会对函数这个概念陌生.而Swift语言中的函数也是大同小异的,今天就跟着小编来学习一下Swift3中函数的不一样的用法. ...

  5. 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?

    直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...

  6. 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的

    前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...

  7. Oracle从文件系统迁移到ASM存储

    环境:RHEL 6.4 + Oracle 11.2.0.4 需求:数据库存储由文件系统迁移到ASM 数据库存储迁移到ASM磁盘组 1.1 编辑参数文件指定新的控制文件路径 1.2 启动数据库到nomo ...

  8. Windows下Git多账号配置,同一电脑多个ssh-key的管理

    这一篇文章是对上一篇文章<Git-TortoiseGit完整配置流程>的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有一些提到一些基础的操作. <Git-Tort ...

  9. Linux零起点之进程管理----c语言编程

    进程 (Process)是指操作系统中被加载到内存中的.正在运行的应用程序实例.进程是系统资源分配的基本单元,在其生命周期内会使用系统中的各种资源.进程主要由程序.数据以及进程控制快(PCB)3个部分 ...

  10. Entity Framework 教程——什么是Entity Framework

    什么是Entity Framework 编写和管理ADO.NET是一个繁琐而又无聊的工作.微软为你的应用提供了一个名为"Entity Framework"的ORM框架来自动化管理你 ...