程序员认识的JavaScript

本文探讨了C#、Java和JavaScript三种语言中的事件模型实现方式。C#通过多播委托实现事件,而Java则采用观察者模式。JavaScript虽然缺乏内置的多播委托特性,但可通过多种手段模拟实现。文章还讨论了各种语言实现事件模型的特点及其灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


======================================================
注:本文源代码点此下载
======================================================

说的直白点,lz对于所讨论的这些东西,基本都处于一知半解的程度。

接口可以完整模拟委托,怎么会不可能做到呢?只是没人做而已,因为语言的设计哲学不同,java毫无必要去整个委托出来。就像javascript也毫无必要自己搞个委托对象出来一样,函数本身就是对象又何必要个调用代理?

至于事件,事件的定义简单到以至于没有人去讨论,事件就是thing that happens,也就是发生的事情。

所以我们讨论的从来都是“事件机制”,“事件模型”,也就是怎么实现事件,或者更具体一点,怎么在model/object之间传递消息。

c#的事件模型就是通过muticastdelegate来实现多播,javascript在运行时根本就不存在多播委托(甚至说根本就不存在委托),可以自己模拟实现。但这就有不同,比如说你能够简单的element.onclick += function(){ ... };来附加一个处理函数么?

当然在javascript实现多播的方法非常多,你可以创建粘合函数例如var multicast = function(){ a(); b(); };也可以采用其他任何你喜欢的办法。

好,我现在问?c#就不可以用emit来创建粘合函数了么?当然可以!

那么我们讨论的是什么呢?是javascript的事件机制和c#的都长得象鸭子?

更何况,事件一定要多播么?可以轮询不?可以广播不?当然都可以。

所谓对事件的理解,基本上就是照着c#的实现念的么。

拿编程语言来说,我们说语言一定有限制,例如java没有委托,不能运算符重载,这就是限制。为了陈述方便,我定义语言可以实现的效果叫做能力,那java没有委托就丧失了动态绑定调用函数的能力了么?不会。。。

lz在对事件的定义中,特别提到不必改变响应行为方自身的实现,恐怕就是针对java的吧?java用观察者模式自然是要求响应方(监听方)要实现监听接口,但这个监听方就不能是一个实际响应方的代理或者说包装?换言之我写一个类监听事件,这个类必须有所约束(譬如说实现某个接口)那我这个类就一定要响应这个事件么?我就不能把这个事件转发给另一个不需要有任何约束的响应类么?这样实际的响应类岂不就不必改变响应行为方自身的实现了?

java没有丧失动态绑定调用函数的能力,所以java也有能力完整的实现c#的事件模型,javascript也可以。

再来看看我们怎么定义c#的事件模型。

如果我们要去定义一个c#的事件模型:我们可以具体到:“使用+=运算符连接某个方法的成员表达式和某个事件的成员表达式”。也可以抽象成:“利用多播函数调用代理实现消息广播”。显然具体的定义毫无意义。

而如果再抽象成:“对象之间传递消息”,或是定义为“一个表达式调用一堆方法”。显然就不是c#的事件模型了。

多播委托本来就是.net事件模型的特点。。。。.net也可以用别的方式来实现事件模型,但我们一说到.net的事件模型就会想到muticastdelegate。一说java的事件模型会想到listener。一说javascript的事件模型会想到什么呢?


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值