论Javascript的类继承
创始人
2024-07-30 03:10:31
0

说到Javascript类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。

无参数类继承的问题

先看一段示例代码,实现B继承于A:

 

  1. function A() {  
  2. }  
  3. A.prototype.a1 = function() {  
  4. };  
  5. function B() {  
  6. }  
  7. B.prototype = new A();  
  8. B.prototype.b1 = function() {  
  9. };  
  10. var b = new B();  
  11. alert(b.constructor == A); // true  
  12. alert(b.constructor == B); // false 

 

这段代码的主要问 题是:

1、需要实例化A作为B的原型,此时就执行了A的构造函数。但按照面向对象的规则,实例化B之前,B及其父类A的构造函数都不应该执行。

2、更改了B的prototype,导致b.constructor不是B而是A。

有参类继承的问题

假设A和B都有两个字符串参数s1和s2,A中计算了两段字符串的总长度,B直接以s1、s2为参数调用A:

 

  1. function A(s1, s2)   
  2. {  
  3. this.totalLength = s1.length + s2.length;  
  4. }  
  5. A.prototype.a1 = function()   
  6. {  
  7. };  
  8. function B(s1, s2)   
  9. {  
  10. }  
  11. B.prototype = new A();  
  12. B.prototype.b1 = function()   
  13. {  
  14. };  
  15. new B(“ab”, “123″); 

 

可以看到,这段代码中根本没有办法把s1和s2传到A,而又因为实例化A作为B的原型时没有 参数,所以出现了异常:

 

  1. s1 is undefined 

 

解决方案

s1 和s2的作用域只在B内,要把它们传到A,就只能在B中操作,借助函数的apply方法就可以实现之:

 

  1. function B(s1, s2)   
  2. {  
  3. A.apply(this, arguments);  
  4. alert(this.totalLength);  

 

接下来的问题就是如何把A的方法添加到B的原型中去。这也不 难,只要遍历A.prototype,把方法复制到B.prototype即可。要注意的是,对于同名的方法,自然是子类优先(重载), 因而不能覆盖:

 

  1. for (var m in A.prototype)   
  2. {  
  3. if (!B.prototype[m])   
  4. { // 父类不能覆盖子类的方法  
  5. B.prototype[m] = A.prototype[m];  
  6. }  

【编辑推荐】

  1. Javascript面向对象编程(二)继承
  2. Javascript面向对象编程(三)非函数对象的继承
  3. JavaScript对象及继承教程之内置对象
  4. 一个字概括:继承了责任感
  5. 8.3.3 配置文件的继承层次结构

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...