JavaScript中的继承(原型链)
一、原型链
ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.
实例1:
function SupType() {
this.property = true;
}
SupType.prototype.getSupvalue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//原型对象等于一个类型的实例
SubType.prototype = new SupType();
SubType.prototype.getSubValue = function() {
return this.subproperty;
};
var instance = new SubType();
alert(instance.getSupvalue());//true
原理分析:

javascript中继承的原理是通过原型让一个引用类型继承另一个引用类型的属性和方法,当一个原型对象等于一个引用类型的实例(就如同将一个对象赋值给另一个对象一样,此时被赋值的对象就拥有了这个对象的属性或方法),此时这个原型对象就拥有了这个实例所拥有的属性或方法.
SupType的实例中包含一个指向原型对象的内部指针和一个属性property,SupType的实例被赋值给了SubType原型对象,现在SubType原型对象中就包含了指向SupType原型对象的内部指针和property属性.此时SubType的实例对象就可以访问到SupType构造函数中的方法getSupvalue,当前getSupvalue中的this指向的是SubType的实例对象,所以最后得到的结果为true.
理解javascript中的原型模式 ,理解了原型模式就很好理解javascript中的原型链,从而就很好理解JavaScript中的继承.
二、继承中定义方法的2个规则.
1.当子类型要重写超类型中的方法或是要为超类型添加不存在的方法时,给原型添加方法的代码必须放在替换原型的语句之后.
实例1:
function SupType() {
this.property = true;
}
SupType.prototype.getSupvalue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//原型对象等于一个类型的实例
SubType.prototype = new SupType();
SubType.prototype.getSupvalue = function() {
return false;
};
SubType.prototype.getSubValue = function() {
return this.subproperty;
};
//SubType.prototype = new SupType();
var instance = new SubType();
alert(instance.getSupvalue());//false
子类型重写了超类型中的方法,因此会屏蔽原来的方法,最后返回的结果为false.
实例2:
如果将SubType.prototype = new SupType();这段替换原型的语句放在给原型添加方法的后面,上面最后得到的结果为true.
function SupType() {
this.property = true;
}
SupType.prototype.getSupvalue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//原型对象等于一个类型的实例
//SubType.prototype = new SupType();
SubType.prototype.getSupvalue = function() {
return false;
};
SubType.prototype.getSubValue = function() {
return this.subproperty;
};
SubType.prototype = new SupType();
var instance = new SubType();
alert(instance.getSupvalue());//true
alert(instance.getSubValue());// instance.getSubValue is not a function
如果是先给子类型的原型添加方法,然后再将超类型的实例赋值给子类型的原型,那么子类型的原型就被这个超类型的原型重写了,子类型中的方法都不再存在,现在子类型的原型指向的是超类型的原型对象,调用方法instance.getSupvalue()是超类型中的方法返回true.
2.通过原型链实现继承时,不要用字面量创建原型方法,这样会重写原型链.
实例:
function SupType() {
this.property = true;
}
SupType.prototype.getSupvalue = function() {
return this.property;
};
function SubType() {
this.subproperty = false;
}
//原型对象等于一个类型的实例
SubType.prototype = new SupType();
//SubType.prototype.getSupvalue = function() {
// return false;
//};
//SubType.prototype.getSubValue = function() {
// return this.subproperty;
//};
SubType.prototype = {
getSubvalue: function() {
return this.subproperty;
}
};
var instance = new SubType();
alert(instance.getSupvalue());
alert(instance.getSubValue());
测试结果:

重写原型链切断了子类型和超类型之间的关系(SubType和SupType现在没有了关系).
JavaScript中的继承(原型链)的更多相关文章
- JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)
第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...
- Javascript 组合继承 原型链继承 寄生继承
Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- 彻底搞懂JavaScript中的继承
你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...
- 关于JavaScript中实现继承,及prototype属性
感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...
- javascript中各种继承方式的优缺点
javascript中实现继承的方式有很多种,一般都是通过原型链和构造函数来实现.下面对各种实现方式进行分析,总结各自的优缺点. 一 原型继承 let Super = functioin(name = ...
- javascript中实现继承的几种方式
javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...
- 深入理解JavaScript中的继承
1前言 继承是JavaScript中的重要概念,可以说要学好JavaScript,必须搞清楚JavaScript中的继承.我最开始是通过看视频听培训班的老师讲解的JavaScript中的继承,当时看的 ...
随机推荐
- SPSS数据分析—分段回归
在SPSS非线性回归过程中,我们讲到了损失函数按钮可以自定义损失函数,但是还有一个约束按钮没有讲到,该按钮的功能是对自 定义的损失函数的参数设定条件,这些条件通常是由逻辑表达式组成,这就使得损失函数具 ...
- CodeForces #100 C 贪心+STL
题目链接:CodeForces #100 C 题意:现在给出n个snowball的半径,3个半径严格递增或递减的snowball,可以组成1个snowmen.问最多能组成多少个snowmen.并且按 ...
- iOS_autoLayout_Masonry
概述 Masonry是一个轻量级的布局框架与更好的包装AutoLayout语法. Masonry有它自己的布局方式,描述NSLayoutConstraints使布局代码更简洁易读. ...
- Oracle中建立表
-- Create table create table STUDENT( sno VARCHAR2(3) not null, sname VARCHAR2(8) not null, ssex VAR ...
- CTSC&&APIO 2015 酱油记
在北京待了一周多,还是写点记录吧. 人民大学校园还是挺不错的,不过伙食差评. CTSC的题目太神,根本不会搞,一试20二试10分..本来都寄希望于提交答案题的..结果就悲剧了. 然后是听大爷们的论文答 ...
- 我的套路(windows):Jenkins+Jmeter+Ant持续集成
前期准备: 1.Jdk1.6或以上:http://www.oracle.com/technetwork/java/javase/downloads/index.html 命令行输入:java -ver ...
- iOS 图片填充 UIImageView (contentMode)
掐指算下来做iOS开发也是有两年多的时间了,然后今天一个超级常用的控件让我颜面大跌,于是我准备把自己的丢人行径公之于众.如果您看到我这篇文章时和我一样,也是刚刚知道这项功能,那么您就当收获了一个... ...
- java SE 常用的排序算法
java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...
- 详解<a>标签
相信对于学前端的人而言<a>标签并不陌生,我们先把他所有的属性列出来 一.主要属性 一般来说,a标签有着四种状态,分别是link,hover,active,visited,接下来我会仔细讲 ...
- iOS-----类和对象,nil/Nil/NULL的区别
iOS中类和对象,nil/Nil/NULL的区别 类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. ...