JS继承——原型链
许多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继承——原型链的更多相关文章
- 一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends
说实在话,以前我只需要知道"寄生组合继承"是最好的,有个祖传代码模版用就行.最近因为一些事情,几个星期以来一直心心念念想整理出来.本文以<JavaScript高级程序设计&g ...
- js 继承 原型链
这里先说基于原型链实现的继承.那首先就得明白什么是原型链了: 每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针. 那么,假如我们让原型对象等于 ...
- 怎么理解js的原型链继承?
前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...
- 前端基本知识(二):JS的原型链的理解
之前一直对于前端的基本知识不是了解很详细,基本功不扎实,但是前端开发中的基本知识才是以后职业发展的根基,虽然自己总是以一种实践是检验真理的唯一标准,写代码实践项目才是唯一,但是经常遇到知道怎么去解决这 ...
- Javascript 组合继承 原型链继承 寄生继承
Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...
- js javascript 原型链详解
看了许多大神的博文,才少许明白了js 中原型链的概念,下面给大家浅谈一下,顺便也是为了巩固自己 首先看原型链之前先来了解一下new关键字的作用,在许多高级语言中,new是必不可少的关键字,其作用是为了 ...
- JS中原型链继承
当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型, ...
- JS 面向对象之继承 -- 原型链
ECMAScript只支持实现继承,其实现继承主要是靠原型链来实现. 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾下构造函数.原型和实例的关系: 每个构造函数都有 ...
- js重点--原型链继承详解
上篇说过了关于原型链继承的问题,这篇详解一下. 1. function animals(){ this.type = "animals"; } animals.prototype. ...
随机推荐
- 查看ubuntu系统信息
root@k8s001:~/go/src/k8s.io/kubernetes# cat /etc/*release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DI ...
- selenium 自动化的坑(2)
UI自动化,一天一坑系列(2) 今天要介绍的坑是这样的:在使用google浏览器的过程中,F12查看页面元素,我的操作步骤是先F12,然后点击箭头,接着点击要查找的元素来实现元素查看,不知道你是不是这 ...
- 对webpack的初步研究6
Plugins 插件是webpack 的支柱.webpack本身构建在您在webpack配置中使用的相同插件系统上! 它们也是这样做的目的别的,一个装载机无法做到的. Anatomy webpack ...
- 对webpack的初步研究1
一.概念: 1.webpack的核心是用于现代JavaScript应用程序的静态模块捆绑器.当webpack处理您的应用程序时,它会在内部构建一个依赖关系图,它映射您的项目所需的每个模块并生成一个或多 ...
- ES6基本用法
es6是JS(JavaScript)的下一个版本. 新增了let命令,用来声明变量.变量在第一个花括号内有用,先声明后引用.不允许重复声明.存在暂时性死区. const声明一个只读的常量.一旦声明,常 ...
- Python配置模块:configparser参数含义
https://blog.csdn.net/CoderPai/article/details/80420698
- Milking Grid poj2185
Milking Grid POJ - 2185 时限: 3000MS 内存: 65536KB 64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 Eve ...
- 笨办法学Python(learn python the hard way)--练习程序11-20
#ex11.py1 print("How old are you?",end=''), age = input() print("How tall are you?&qu ...
- zhanghao
账号:wx8b9ddd1c943ce95f 密码:fa72de9a1721849edc7f41f8a81019e5
- Getting Started Tutorial from msdn
Getting Started Tutorial The topics contained in this section are intended to give you quick exposur ...