许多OO语言支持两种继承:接口继承实现继承。ECMAScript只支持实现继承,且继承实现主要依赖原型链实现。

原型链

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

构造函数、原型和实例的关系:每个构造函数均有一个原型对象,原型对象均包含一个指向构造函数的指针,实例均包含一个指向原型对象的内部指针。若让原型对象等于另一个类型的实例,此时原型对象将包含一个指向 另一个原型的指针,相应地,另一个原型中也包含一个指向另一个构造函数的指针。若另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。

原型链基本模式,示例代码如下:

 <!DOCTYPE html>
<html>
<head>
<title>原型链-继承</title>
<script type="text/javascript">
function Supertype(){
this.property=true;//propertype属于Supertype实例属性
} Supertype.prototype.getSuperValue=function(){//getSuperValue()属于原型方法
return this.property;
};//至此,Supertype原型包含指向Supertype构造函数的constructor属性和getSuperValue()方法。 function Subtype(){
this.subproperty=false;//subproperty属于Subtype实例属性
} //继承了Supertype,重写了原型对象
Subtype.prototype=new Supertype(); //添加新方法
Subtype.prototype.getSubValue=function(){//为Subtype原型添加方法getSubValue()
return this.subproperty;
}//至此,Subtype原型模型中包含属性和方法为:内部属性[prototype]、property属性、getSuperValue()方法。作为一个Supertype类型的实例,其内部属性[prototype]指向Supertype原型,实例属性property。 //重写超类中的方法,因此需要谨慎地定义方法
Subtype.prototype.getSuperValue=function(){
return false;
}

var instance=new Subtype();//实例内部属性[prototype]指向Subtype原型;且包含实例属性subproperty
alert(instance.getSuperValue());//在重写超类函数之前返回true;重写了超累函数之后返回false //确定原型和实例的关系
alert(instance instanceof Object);//true
alert(instance instanceof Supertype);//true
alert(instance instanceof Subtype);//true alert(Object.prototype.isPrototypeOf(instance));//true
alert(Supertype.prototype.isPrototypeOf(instance));//true
alert(Subtype.prototype.isPrototypeOf(instance));//true
</script>
</head>
<body>
</body>
</html>

原型链的问题:
(1)原型链子类实例共享父类引用类型,同原型模型的问题一样。

(2)在创建子类的实例时,不能在不影响所有对象实例的情况下,向超类型的构造函数传递参数

因此,实践中很少单独使用原型链。

文章内容部分摘自《JavaScript高级程序设计(第3版)》

JS继承——原型链的更多相关文章

  1. 一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends

    说实在话,以前我只需要知道"寄生组合继承"是最好的,有个祖传代码模版用就行.最近因为一些事情,几个星期以来一直心心念念想整理出来.本文以<JavaScript高级程序设计&g ...

  2. js 继承 原型链

    这里先说基于原型链实现的继承.那首先就得明白什么是原型链了: 每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针. 那么,假如我们让原型对象等于 ...

  3. 怎么理解js的原型链继承?

    前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...

  4. 前端基本知识(二):JS的原型链的理解

    之前一直对于前端的基本知识不是了解很详细,基本功不扎实,但是前端开发中的基本知识才是以后职业发展的根基,虽然自己总是以一种实践是检验真理的唯一标准,写代码实践项目才是唯一,但是经常遇到知道怎么去解决这 ...

  5. Javascript 组合继承 原型链继承 寄生继承

    Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...

  6. js javascript 原型链详解

    看了许多大神的博文,才少许明白了js 中原型链的概念,下面给大家浅谈一下,顺便也是为了巩固自己 首先看原型链之前先来了解一下new关键字的作用,在许多高级语言中,new是必不可少的关键字,其作用是为了 ...

  7. JS中原型链继承

    当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型, ...

  8. JS 面向对象之继承 -- 原型链

    ECMAScript只支持实现继承,其实现继承主要是靠原型链来实现. 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾下构造函数.原型和实例的关系: 每个构造函数都有 ...

  9. js重点--原型链继承详解

    上篇说过了关于原型链继承的问题,这篇详解一下. 1. function animals(){ this.type = "animals"; } animals.prototype. ...

随机推荐

  1. php session之redis存储

    前提:redis已安装好. php代码: <?php ini_set("session.save_handler", "redis"); ini_set( ...

  2. Python PEP8代码书写规范

    摘自: 规范 https://blog.csdn.net/ratsniper/article/details/78954852

  3. 封装 pyinstaller -F -i b.ico excel.py

    安装pywin32,可以参考<怎么给python安装pywin32模块?> 一定要注意对应的python版本,否则不能安装.   5怎么给python安装pywin32模块?   2 用命 ...

  4. Redirecting to /bin/systemctl restart mysql. service Failed to restart mysql.service: Unit not found.

    使用如下命令操作mysql即可: systemctl restart mysqld.service systemctl start mysqld.service systemctl stop mysq ...

  5. 对logistic回归分析的两重认识

    logistic回归,回归给人的直观印象只是要求解一个模型的系数,然后可以预测某个变量的回归值.而logistic回归在应用中多了一层含义,它经常应用于分类中.第一重认识:logistic是给真正的回 ...

  6. DELPHI 调试IOS时出现 Please specify exact device preset UUID

    右击设备DEVICE, 选择REFRESH刷新, 再重新选择一个设备即可.

  7. springboot整合 thymeleaf 案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  8. yum源更换

    折腾了半天,怀疑自己能力 的时候,发现原来不是我的错.树莓派换源国内的aliyun,163都不能用,最好找到这个 # CentOS-Base.repo # # The mirror system us ...

  9. Linux负载均衡软件LVS

    linux下的开源负载均衡软件LVS的安装.配置和使用.LVS是一个中国人创建和开发的开放源码项目,利用LVS可以构建高可用.高可靠的负载均衡集群,因此,利用Linux+LVS不但可以假设高性能的负载 ...

  10. CSS3订单提交按钮Loading代码

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...