一、什么是继承?

继承是面向对象语言的一个重要概念。许多面向对象语言都支持两种继承方式:接口继承和实现继承;接口继承只继承方法签名,而实现继承则继承实际的方法。由于函数没有签名,所以ECMAScript只支持实现继承,而实现继承主要是依靠原型链来实现的。

二、继承的多种方法分析

(一)原型继承

基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法;

  1. function Animal() {
  2.   this.species = '动物'
  3.   this.colors = ['白色']
  4. }
  5. function Cat(name, eat) {
  6.    this.name = name
  7.    this.eat = eat
  8. }
  9. Cat.prototype = new Animal()
  10. var cat1 = new Cat('猫', '老鼠')
  11. console.log(cat1.species) //动物
  12. console.log(cat1.colors) //['白色']

存在的问题:

  1. cat1.colors.push('黑色')
  2. cat1.colors //['白色', '黑色']
  3. cat2.colors //['白色', '黑色']

当tCat通过原型链继承了Animal后,Cat.prototype就变成了Animal的一个实例,因此它也拥有了一个自己的colors属性,结果:Cat的所有的实例都会共享colors属性;

(二)构造函数继承

基本思想:在子类型构造函数的内部调用超类型构造函数。函数只不过是在特定环境中执行代码的对象,因此可通过使用call()和apply()在新创建的对象上执行构造函数

  1. function Cat(name, eat) {
  2.  
  3.   Animal.apply(this, arguments)
  4.   this.name = name
  5.  
  6.   this.eat = eat
  7.  
  8. }
  9.  
  10. var cat1 = new Cat('猫', '鱼')
  11.  
  12. console.log(cat1.species) //动物
  13. cat1.colors.push('黑色')
  14. console.log(cat1.colors) //['白色', '黑色']
  15. var cat2 = new Cat('猫', '猫粮')
  16. console.log(cat2.colors) //['白色']

存在问题:方法都在构造函数中定义,所以没法利用函数的复用;并且在超类型的原型中定义的方法对于子类型而言是不可见的。

  1. function Animal() {
  2.   this.species = '动物'
  3.   this.colors = ['白色']
  4. }
  5. Animal.prototype.getColor = function() {
  6. return this.colors
  7. }
  8. function Cat(name, eat) {
  9.  
  10.   Animal.apply(this, arguments)
  11.   this.name = name
  12.  
  13.   this.eat = eat
  14.  
  15. }
  16.  
  17. var cat1 = new Cat('猫', '鱼')
  18. cat1.getColor() //报错:cat1.getColor is not a function

(三)组合继承

基本思想:使用原型链实现对原型属性和方法的继承,而通过构造函数实现对实例属性的继承;

  1. function Animal(species) {
  2.  
  3.   this.species = species
  4.   this.colors = ['白色']
  5.   }
  6. Animal.prototype.getColor = function() {
  7.  
  8.   console.log(this.colors)
  9.  
  10. }
  11. function Cat(name, eat) {
  12.  
  13.   //继承属性
  14.   this.name = name
  15.  
  16.   this.eat = eat
  17.  
  18.   Animal.call(this, name)
  19. }
  20. //继承方法
  21. Cat.prototype = new Animal()
  22. Cat.prototype.concatructor = Cat
  23. Cat.prototype.sayName = function() {
  24.   console.log(this.name)
  25. }
  26. var cat1 = new Cat('猫', '吃鱼')
  27.  
  28. cat1.colors.push('黑色')
  29. console.log(cat1.colors) //['白色', '黑色']
  30. cat1.getColor() //['白色', '黑色']
  31. cat1.sayName() //'猫'
  32.  
  33. var cat2 = new Cat('波斯猫', '吃猫粮')
  34. console.log(cat2.colors) //['白色']
  35. cat2.getColor() //['白色']
  36. cat2.sayName() //'波斯猫'

javascript——原型与继承的更多相关文章

  1. 深入理解:JavaScript原型与继承

    深入理解:JavaScript原型与继承 看过不少书籍,不少文章,对于原型与继承的说明基本上让人不明觉厉,特别是对于习惯了面向对象编程的人来说更难理解,这里我就给大家说说我的理解. 首先JavaScr ...

  2. JavaScript原型与继承

    JavaScript原型与继承 原型 在JavaScript中,每个函数都有一个prototype属性,这个属性是一个指针,指向该函数的原型对象.这个原型对象为所有该实例所共享.在默认情况下,原型对象 ...

  3. JavaScript原型与继承的秘密

    在GitHub上看到的关于JavaScript原型与继承的讲解,感觉很有用,为方便以后阅读,copy到自己的随笔中. 原文地址:https://github.com/dreamapplehappy/b ...

  4. JavaScript 原型与继承

    JavaScript 原型与继承 JavaScript 中函数原型是实现继承的基础.prototype.construct.原型链以及基于原型链的继承是面向对象的重要内容 prototype 原型即 ...

  5. javascript原型链继承

    一.关于javascript原型的基本概念: prototype属性:每个函数都一个prototype属性,这个属性指向函数的原型对象.原型对象主要用于共享实例中所包含的的属性和方法. constru ...

  6. JavaScript 原型与继承机制详解

    引言 初识 JavaScript 对象的时候,我以为 JS 是没有继承这种说法的,虽说 JS 是一门面向对象语言,可是面向对象的一些特性在 JS 中并不存在(比如多态,不过严格来说也没有继承).这就困 ...

  7. 8条规则图解JavaScript原型链继承原理

    原形链是JS难点之一,而且很多书都喜欢用一大堆的文字解释给你听什么什么是原型链,就算有图配上讲解,有的图也是点到为止,很难让人不产生疑惑. 我们先来看一段程序,友情提示sublimeText看更爽: ...

  8. 【Javascript】Javascript原型与继承

    一切都是对象! 以下的四种(undefined, number, string, boolean)属于简单的值类型,不是对象.剩下的几种情况——函数.数组.对象.null.new Number(10) ...

  9. 【前端知识体系-JS相关】深入理解JavaScript原型(继承)和原型链

    1. Javascript继承 1.1 原型链继承 function Parent() { this.name = 'zhangsan'; this.children = ['A', 'B', 'C' ...

  10. JavaScript原型及继承

    一.浅谈原型 首先我们要知道创建对象的方法有两种: 1.通过字面量的方式直接创建 var obj = { name:'baimao', age:21 } 2.通过构造函数创建对象 function P ...

随机推荐

  1. Java 内存映射文件

    import java.io.*; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import jav ...

  2. SQL SERVER 活动监视-sys.dm_exec_requests

    sys.dm_exec_requests (Transact-SQL)应用: 针对 SQL Server 内正在执行的每个请求返回一行.sys.dm_exec_connections.sys.dm_e ...

  3. 消息中间件及IBM MQ

    MQ 消息中间件: 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源. 中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯.是连接两个独立应用程 ...

  4. youku_androidid

    youku_androidid = 1310; imei screenwidth screenhight

  5. Hadoop学习(3)-mapreduce快速入门加yarn的安装

    mapreduce是一个运算框架,让多台机器进行并行进行运算, 他把所有的计算都分为两个阶段,一个是map阶段,一个是reduce阶段 map阶段:读取hdfs中的文件,分给多个机器上的maptask ...

  6. 开源项目托管到GitHub上

    前提是安装了git客户端 1.进入你的GitHub账户 2.点击new repositories   创建一个新的项目 输入项目名和项目描述   3.复制该项目的https路径 4.找一个文件夹来存放 ...

  7. MyBatis映射,抛出Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'oid' in 'class java.lang.String'

    原因在于: 在MyBatis中使用动态语句的判断时,传入的参数(parameterType)为Java基本数据类型,获取的结果(resultType)为JavaBean对象,此时就会抛出该异常,此时可 ...

  8. TreeSet类的排序

    TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系, ...

  9. Integrating Thymeleaf with Spring

    这个是基于注解的配置方式,基于配置文件的http://www.cnblogs.com/honger/p/6875148.html 一.整体结构图 二.web.xml文件,这里使用了注解的方式 < ...

  10. Redis(六)--- Redis过期策略与内存淘汰机制

    1.简述 关于Redis键的过期策略,首先要了解两种时间的区别,生存时间和过期时间: 生存时间:一段时长,如30秒.6000毫秒,设置键的生存时间就是设置这个键可以存在多长时间,命令有两个 expir ...