JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承
继承第一种方式:对象冒充
<script type="text/javascript"> //继承第一种方式:对象冒充 function Parent(username) //父类对象
{
this.username = username; //下面的代码最关键的部分就是将子对象的this传递给了父对象 this.sayHello = function()
{
alert(this.username);
}
} function Child(username, password) //子类对象
{
//下面三行代码是最关键的代码
this.method = Parent; //定义method属性,指向Parent,即指向了上面的构造函数
this.method(username);//把username传递过去,调用构造函数,此时Parent函数体中的this即当前的Child对象
delete this.method; //删掉method属性,因为Child已经具备了Parent的属性和方法 //下面可以增加一些子类特有的属性和方法
this.password = password; this.sayWorld = function()
{
alert(this.password);
}
} //生成这两个类的对象
var parent = new Parent("zhangsan");
var child = new Child("lisi", "1234"); parent.sayHello(); child.sayHello();
child.sayWorld(); </script>
使用这种方式实现继承的时候,JS可以实现多重的继承,但是有时候会造成一些干扰,比如同名方法的覆盖,所以不太推荐使用多继承。
继承第二种方式:call方法方式
call方法是定义在Function对象中的方法,因此我们定义的每个函数都有该方法。
可以通过函数名来调用call方法,call方法的第一个参数会被传递给函数中的this,从第二个参数开始,逐一赋值给函数中的参数。
call方法:
<script type="text/javascript"> //call方法方式,Function对象中的方法 function test(str, str2)
{
alert(this.name + ", " + str + ", " + str2);
} var object = new Object();
object.name = "zhangsan"; //test.call相当于调用了test函数
test.call(object, "shengsiyuan", "hello"); //将object赋给了this
//第一个参数赋给this,后面的参数逐次赋给方法参数 </script>
call方法实现继承:
<script type="text/javascript"> //使用call方式实现对象的继承 function Parent(username)
{
this.username = username; this.sayHello = function()
{
alert(this.username);
}
} function Child(username, password)
{
Parent.call(this, username);//这样语句很关键,等价于对象冒充中的三行语句
//执行之后子类就具有了基类的属性和方法 //子对象的新增属性和方法
this.password = password; this.sayWorld = function()
{
alert(this.password);
}
} var parent = new Parent("zhangsan"); var child = new Child("lisi", "123"); parent.sayHello(); child.sayHello();
child.sayWorld(); </script>
继承第三种方式:apply方法方式
apply和call一样,都是定义在Function对象里面的。
<script type="text/javascript"> //使用apply方法实现对象继承 function Parent(username)
{
this.username = username; this.sayHello = function()
{
alert(this.username);
}
} function Child(username, password)
{
Parent.apply(this, new Array(username));//apply方法方式实现继承,后面的参数以数组的形式传入 this.password = password; this.sayWorld = function()
{
alert(this.password);
}
} var parent = new Parent("zhangsan");
var child = new Child("lisi", "123"); parent.sayHello(); child.sayHello();
child.sayWorld(); </script>
继承第四种方式:原型链方式
<script type="text/javascript"> //使用原型链(prototype chain)方式实现对象继承 function Parent()
{ } Parent.prototype.hello = "hello";
Parent.prototype.sayHello = function()
{
alert(this.hello);
} function Child()
{ } Child.prototype = new Parent();//子类具有父类的属性和方法
//扩展属性
Child.prototype.world = "world";
Child.prototype.sayWorld = function()
{
alert(this.world);
} var child = new Child(); child.sayHello();
child.sayWorld(); </script>
原型链的方式,缺点是无法给构造函数传递参数。
继承的第五种方式:混合方式
这种方式是对原型链方式的一种改进,使得可以向构造函数传递参数。
这种方式是比较推荐的一种方式。
<script type="text/javascript"> //使用混合方式实现对象继承(推荐)
//父对象
function Parent(hello)
{
this.hello = hello;
} Parent.prototype.sayHello = function()
{
alert(this.hello);
}
//子对象
function Child(hello, world)
{
Parent.call(this, hello);//通过call实现属性的继承 this.world = world;//新增加的属性
} Child.prototype = new Parent();//通过原型链实现方法的继承 Child.prototype.sayWorld = function()
{
alert(this.world);
} var child = new Child("hello", "world"); child.sayHello();
child.sayWorld(); </script>
实例
<script type="text/javascript"> function Shape(edge)
{
this.edge = edge;//属性,多少条边,通过构造函数的方式定义
} Shape.prototype.getArea = function()//通过原型的方式来定义方法
{
return -1;//基类返回一个没有意义的值
} Shape.prototype.getEdge = function()
{
return this.edge;
} //定义子对象Triangle
function Triangle(bottom, height)
{
Shape.call(this, 3); //Triangle的属性
this.bottom = bottom;
this.height = height;
} Triangle.prototype = new Shape();//继承Shaple中的所有方法 Triangle.prototype.getArea = function()//重写方法
{
return 0.5 * this.bottom * this.height;
} var triangle = new Triangle(10, 4); //alert(triangle.getEdge());
//alert(triangle.getArea()); //另一个子类:四边形
function Rectangle(bottom, height)
{
Shape.call(this, 4); this.bottom = bottom;
this.height = height;
} Rectangle.prototype = new Shape();//通过原型继承父类的所有方法 Rectangle.prototype.getArea = function()//覆写方法
{
return this.bottom * this.height;
} var rectangle = new Rectangle(20, 40); alert(rectangle.getEdge());
alert(rectangle.getArea()); </script>
参考资料
圣思园张龙老师Java Web系列视频教程。
JavaScript学习13 JavaScript中的继承的更多相关文章
- Javascript学习2 - Javascript中的表达式和运算符
原文:Javascript学习2 - Javascript中的表达式和运算符 Javascript中的运算符与C/C++中的运算符相似,但有几处不同的地方,相对于C/C++,也增加了几个不同的运算符, ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- JavaScript学习笔记——JS中的变量复制、参数传递和作用域链
今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- javascript学习(二)javascript常见问题总结
在js使用过程中,经常会碰到一些问题,本人利用闲暇时间整理了一些常见问题的解决方法,贴出来和大家分享,有需要的朋友可以参考下 1.JS中方法和变量都是区分大小写的 2.单引号.双引号在JS中没有特殊 ...
- JavaScript学习笔记(散)——继承、构造函数super
构造函数中的super 今天看<JavaScript设计模式与开发实践>时,在书中看到一段代码出现super语句,第一次看到这个关键字,所以上网查了下它的作用,发现这个关键字是来自java ...
- JavaScript学习3:原型和继承
原型 我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包括能够由特定类型的全部实例共享的属性和方法.逻辑上能够这么理解:prototype是通过调用构造函数而创 ...
- 【javascript学习——《javascript高级程序设计》笔记】DOM操作
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...
随机推荐
- Pure – 赞!轻量的、响应式的 CSS 模块集
Pure 是一组轻量的,响应式的 CSS 模块,您可以使用在任何的 Web 项目中.充分考虑了移动设备中的使用,保持文件体积尽量小,每行 CSS 都进行了仔细的考虑. Pure 基于 Normaliz ...
- J2EE修炼之四书五经[转自2004年程序员]
J2EE修炼之四书五经 作者:彭晨阳 J2EE其实没有四书五经,因为J2EE一直如汹涌澎湃的大江,推陈出新,不断高速发展,这是一种带领我们走向未来的技术.当然,如何在这种气势如虹的潮流之中不至于迷失方 ...
- requests模块--python发送http请求
requests模块 在Python内置模块(urllib.urllib2.httplib)的基础上进行了高度的封装,从而使得Pythoner更好的进行http请求,使用Requests可以轻而易举的 ...
- 了解SpringMVC框架及基本工作流程
传统原生的JSP+Servlet在开发上过程上虽然简单明了,JSP页面传递数据到Servlet,Servlet整理数据(逻辑开发)或者从数据库提取数据接着再转发到JSP页面上,但是其似乎只能止步于此, ...
- LINUX总结
LINUX总结 crazyacking 2016-02-26 主要对socket编程,多线程,定时器,条件变量总结 多线程篇 概念: 多线程就是允许一个进程内存存在多个控制权,实现多个线程并发执行. ...
- 使用html和css的一些经验
1.注释须知:html中注释不能这样写: <div></div><!--------这是错误写法-------> <div></div>&l ...
- ZooKeeper----Java实例文档
**************************************************************************************************** ...
- No.017:Letter Combinations of a Phone Number
问题: Given a digit string, return all possible letter combinations that the number could represent.A ...
- C++析构函数调用异常问题研究
最近又遇到一个奇葩问题,程序在自己的开发机器和某些机器上运行完好,但是在测试人员的几台机器上运行就直接推出了.开始以为是出现了野指针,因为delete野指针时程序会直接退出.代码翻来覆去过来即便确认没 ...
- Verilog学习笔记简单功能实现(六)...............计数分频电路
在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...