javascript 中用apply实现类的继承

本文通过具体示例展示了如何使用JavaScript中的apply方法实现类的继承。在子类构造函数中调用父类构造函数,并讨论了this指向及属性覆盖等问题。

在网上看到一段关于用apply方法实现js类中的继承。代码 如下

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>应用call和apply实现继承</title> </head> <SCRIPT LANGUAGE="JavaScript"> <!-- function Base( ChineseName ) { this.ChineseName = "父类中文名" this.BaseMethod = BaseMethod; function BaseMethod( EnglishName ) { document.write("ChineseName: " + this.ChineseName + "---" + "EnglishName: " + EnglishName); document.write("<br/>"); } } function Derive( EnglishName ) { Base.call(this, EnglishName) /* 这里可以写为 Base.apply(this,EnglishName) 或 Base.apply(this,arguments) */ //this.ChineseName="this is derive inner Chinese Name" this.Name = EnglishName this.Method = Method; function Method( EnglishName ) { document.write("Name: " + this.Name + "<br/>" + "EnglishName: " + EnglishName); document.write("<br/>"); } } var O = new Derive("比尔") document.write(O.ChineseName+"<br/>"); document.write(O.Name+"<br/>"); //O.Method("Bill"); O.BaseMethod("Gates"); //--> </SCRIPT> <body> </body> </html>

在子类的构造函数中,对父类的构造函数应用apply方法,就可以实现继承。很像Java,c++中的继承---在子类的构造函数中调用父类的构造函数。

在调用Derive类的ChineseName属性时,Derive类是没有这个属性的(被注释掉了),程序没有出现异常,显示的是Base类的ChineseName属性值。

在调用Derive类的BaseMethod方法时,也是调用继承Base类的BaseMethod方法。apply方法都知道是改变调用函数的上下文,也就是函数中的隐含参数---this。这样的话,调用Derive类的BaseMethod方法时,函数内部用到了“this.ChineseName ”。此时的“this”,是否已经指向Derive类的对象--O,应该是,但Derive类没有ChineseName属性,程序显示的是Base类ChineseName属性值,当在

Derive类内增加ChineseName属性后,程序可以显示Derive类的对象的ChineseName属性,这也就很像高级语言中的继承特性了,

子类中有的,用子类的,没有的就用父类的。

但在这有个前提,就是Base.call(this, EnglishName)要放在Derive类构造函数的前面(最好第一行)。如果将Base.call(this, EnglishName)放在Derive类ChineseName属性后,即使子类中有这个属性,也不会显示还是现实父类的同名属性。

可能解释是,在子类的构造函数中以apply方式调用父类的构造函数。那么子类就可以继承父类的属性,方法。但子类和父类中的属性会因为顺序而相互覆盖。所以要做到“子类中有的,用子类的,没有的就用父类的”这点,就把父类的构造的函数尽量放在子类构造函数内部的前面。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值