谈谈javascript类(转)

JavaScript 主要的问题到不是不支持多重继承,熟悉 C++ 的朋友都知道,多重继承是一只双刃剑,用的不好也会伤了自己。
JavaScript 的设计主要参考了 Java 和 Perl 两种语言。其实 JavaScirpt 这门语言本身的设计是非常精巧的,结合了 Java 和 Perl 的很多优点,语言本身的设计即使拿到今天也不落伍。和 Python 一样,JavaScript 中函数和类是合一的,这样的设计带来了很多的好处。
JavaScript 最初是为了编写一些比较简单的页面脚本而设计的,并没有考虑到大规模组件化开发的需求,对于面向对象编程的支持是很不够的。突出表现在以下两个方面:
1、JavaScript 不支持 package 或者 namespace 的概念,所有的函数名称都是全局名称,因此在大规模开发时容易造成重名。
2、JavaScript 中的继承并不是真正的继承,而是所有的子类对象共享同一个父类对象。这个父类对象相当于一个 Singleton,一般不应该有自己的属性。如果某个子类对象修改了父类对象的属性,就会影响到所有的子类对象。正是因为这个限制,JavaScript 很难实现 3 层以上的继承,因此无法构建大型的面向对象继承体系(当然,那位说了,为什么要用继承,全部用组合难道还有解决不了的问题么?)。

上面两个是最主要的问题,这两个问题限制了基于 JavaScript 的大规模组件化开发。不过考虑到目前客户端 Ajax 组件库的规模相对于服务器端 Java 组件库的规模来说要小的多,JavaScript 目前的能力基本上够用了。

在 JavaScript 的下一版本——JavaScript 2.0 或者 ECMAScript 4 中,都已经把支持真正的面向对象编程能力列入了重点增强的内容。
http://www.mozilla.org/js/language/js20/core/classes.html
http://www.mozilla.org/js/language/es4/core/classes.html
其实 class 在现在的 JS.Net 中已经被 M$ 抢先支持了。JavaScript 也将引入 class,到那个时候我认为从语言本身来说,JavaScript 是完全可以与 Python 媲美的。

另外,挖出这些老帖的人要注意,上面这个主题仅仅代表 robbin 去年的观点,robbin 现在的想法与那个时候已经有了一些差别。每个人的观点都不是一成不变的,没有那么僵硬的人。包括我 dlee 在内,不要拿我一年前说过的话来攻击我。我一年前说过的话,现在很可能想法已经发生了很大的变化。不断前进的人完全没有必要担心否定自己以前说过的话。

Javascript是完整的面向对象语言。支持继承。

当然,跟我们以前所认识的基于类的OO有点不同,它是基于prototype的。简单的说:他的继承其实就是clone,它没有class的概念,只有object,你可以在任意的时候以某个object作为自己的原型,生成一个新的object。

另外,Function也被作为一种object存在。实际上,Javascript的重的所谓的构造子也就是一个Function,因而也是一个对象,通过构造子创建一个对象,跟前面说的以xx为原型clone一个对象其实是一回事。因此,Javascript中,所有的对象都是clone出来的,继承就是一种clone。所有的对象在运行中都可以改变其property,甚至增加或删除。大家可以想像一下他的用处。

另外,Function作为object还带来了一些额外的好处,比如可以尝试fp编程等等,就不细说了。

围绕着Function对象,有一大堆的属性,比如Context,比如Arguments,往里深入下去会发现有Execute Frame,apply(call)以及很多乱七八糟的东西,足够在里面打滚了。呵呵。

那位说了,找你这么说,javascript没一点坏处了?

不是,Javascript的坏处也不是没有,那就是,由于没有基于class的机制,所有的对象都是clone出来的,这意味着它没有办法实现多继承,——说道这儿,我已经仿佛看见有人吐口水了,什么玩艺?多继承!!——多继承被人批的体无完肤了,但是他总是以各种各样的伪装的面貌出现在人们面前,最最被欣赏的是Interface,次之的有mixin,再次有delegation,甚至AOP在某种意义上也是MI。对于SI的语言,如果没有某种机制可以偷偷摸摸的引入MI,在实际的应用中会非常困难的。所以有人说JS不适合大型应用,我基本上是赞同的。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值