论坛首页 Web前端技术论坛

JavaScript里面真的需要继承吗?

浏览 15218 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (18)
作者 正文
   发表时间:2009-04-21   最后修改:2009-04-21
JavaScript语言本身并不直接提供继承功能,所以有很多的框架尝试着给他加上继承的能力.
目的就在于使JavaScript具有类的继承能力.

我的问题是,JavaScript为啥没有直接在语言这个层次就提供继承功能,而非要各个第三方框架来扩展实现呢?

以我最近对JavaScript的学习,我初步感觉是,JavaScript语言的设计,没有把继承功能加进语言的核心,是一个精心的设计,目的就在于降低JavaScript本身的复杂度,以及代码的复杂度.并非语言的设计者不能够来做这件事情,而是出于特定的考虑,决定在系统中不加入这一特性.当然这是我的猜测.

以我这几年的有限开发经验来看,单纯就继承这一功能来说,这一特性在系统设计中非常容易被滥用.一般自己开发的系统,继承3到4层是很常见的情况,项目开发的时间越长,涉及的人越多,继承的层次也就会不断增加.在某公司的产品中,我曾经看到过一个类的继承深度是20多层,抛出一个错误堆栈时,长长的信息简直连一个屏幕都放不下.

这个问题是怎么来的呢,以我的观点,这是单纯的继承机制必然带来的问题,当一个类是自己本身时,他是自由的,修改这个类只需要考虑所有调用这个类的类就可以了;当一个类拥有一堆子类时,修改这个类将波及到所有子类,而每个子类又波及到所有调用子类的所有类,因此修改这个类就很困难了.而当这个类下面有很多的子子孙孙时,出于系统稳定性的考虑,几乎没有那个头脑正常人愿意来修改这个超级父类了,而更愿意在下面再搞个子类出来.
于是乎,代码就恶性膨胀起来了.
而最可怕的是,这种代码的膨胀几乎是不可逆的,当你想试图对任何一个类进行简化时,会发现根本无从下手,一旦删除一个方法,没有人能够说明白需要测试多少个接口才能保证这个修改是没有错误的.

这种继承带来的后果,不是今天才出现的,也不是Java特有的.在早期的VC,Delphi发展过程中,都出现过由于产品升级修改了某个类,而造成新旧版本不能兼容的问题.因此可以,对继承的滥用对系统是非常有害的.

正是基于继承可能是有害的这样的考虑,象VB这种开发语言,尽管非常流行,却始终没有在其中增加继承的功能,实践也证明,继承并非缺此不可的功能.

莫非JavaScript也是出于同样的考虑,所以不在语言核心提供继承功能?这只是我的猜测.

但考察无论是prototype还是extjs,这些框架在增强JavaScript的功能的同时,难道没有把JavaScript变得更加复杂吗?从长远来看,系统里面增加这样的复杂性究竟是划算呢,还是不划算呢?

一己之见,欢迎大家讨论.
   发表时间:2009-04-21  
我觉得划算,我的判断很简单,用prototype/extjs的筒子很多,而且不少筒子用得很high
0 请登录后投票
   发表时间:2009-04-21  
yeaha 写道
我觉得划算,我的判断很简单,用prototype/extjs的筒子很多,而且不少筒子用得很high

这个理由不够充分.
如果有这么多好处,没有任何缺点的话,js在设计的时候就应该把这个特性加进去才符合常理啊.
包括vb,ms同时有vc,vb两大产品,一个有继承,一个没继承,既然做这种产品特征上的刻意分别,应该是有它专门的考虑的.
很难相信js的发明人不知道如何在语言中加入继承的特性.
0 请登录后投票
   发表时间:2009-04-22  
把A的方法拷贝给B
之后A与B一点关系都没有
这不是非常合理么
要继承干什么用?

静态语言很难作到这点.所以要继承,要实现.
0 请登录后投票
   发表时间:2009-04-22  
楼主这个提示颇大,看来我的UI设计思想要转变了
0 请登录后投票
   发表时间:2009-04-22  
一切从实用出发,想用就用
0 请登录后投票
   发表时间:2009-04-22  
lz考虑下UI,组件树。
0 请登录后投票
   发表时间:2009-04-23  
liujunsong 写道
以我这几年的有限开发经验来看,单纯就继承这一功能来说,这一特性在系统设计中非常容易被滥用.一般自己开发的系统,继承3到4层是很常见的情况,项目开发的时间越长,涉及的人越多,继承的层次也就会不断增加.在某公司的产品中,我曾经看到过一个类的继承深度是20多层,抛出一个错误堆栈时,长长的信息简直连一个屏幕都放不下.

这个问题是怎么来的呢,以我的观点,这是单纯的继承机制必然带来的问题,当一个类是自己本身时,他是自由的,修改这个类只需要考虑所有调用这个类的类就可以了;当一个类拥有一堆子类时,修改这个类将波及到所有子类,而每个子类又波及到所有调用子类的所有类,因此修改这个类就很困难了.而当这个类下面有很多的子子孙孙时,出于系统稳定性的考虑,几乎没有那个头脑正常人愿意来修改这个超级父类了,而更愿意在下面再搞个子类出来.
于是乎,代码就恶性膨胀起来了.
而最可怕的是,这种代码的膨胀几乎是不可逆的,当你想试图对任何一个类进行简化时,会发现根本无从下手,一旦删除一个方法,没有人能够说明白需要测试多少个接口才能保证这个修改是没有错误的.


这种继承带来的后果,不是今天才出现的,也不是Java特有的.在早期的VC,Delphi发展过程中,都出现过由于产品升级修改了某个类,而造成新旧版本不能兼容的问题.因此可以,对继承的滥用对系统是非常有害的.

正是基于继承可能是有害的这样的考虑,象VB这种开发语言,尽管非常流行,却始终没有在其中增加继承的功能,实践也证明,继承并非缺此不可的功能.

莫非JavaScript也是出于同样的考虑,所以不在语言核心提供继承功能?这只是我的猜测.

但考察无论是prototype还是extjs,这些框架在增强JavaScript的功能的同时,难道没有把JavaScript变得更加复杂吗?从长远来看,系统里面增加这样的复杂性究竟是划算呢,还是不划算呢?

一己之见,欢迎大家讨论.[/size]

分明是继承的使用有问题,偏要归咎到语言上。
那JavaScript的function原生的prototype属性是做什么的呢?
0 请登录后投票
   发表时间:2009-04-23  
“曾经看到过一个类的继承深度是20多层”。。。
不是继承有问题,而是那个人想法有问题,。。

JS没继承这概念,但有类似继承这功能,而且很好用,用白了也像平时借用方法一样,只是给一些JS库封一封,。

我也写过一篇有关JS继承的例子,

http://www.iteye.com/topic/360016

没觉"继承"有什么坏处。


0 请登录后投票
   发表时间:2009-04-29  
上面的童鞋说的还是蛮赞同的,“借用”
我们只需要借用另一个对象的方法
没必要整的太OO学术化
虽然有点像继承
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics