AS3.0监听视频的metaData和cuePoint时,使用了onMetaData()和onCuePoint()类AS2.0的形式,而没用addEventListener这种更"现代化"的形式,为什么?
这个问题是我在知乎上的一个回答:http://www.zhihu.com/question/20700892/answer/15902820
我猜想是历史原因。
AS提供的NetStream类比较特殊。它既支持本地Video对象播放,也支持基于HTTP的流媒体播放。最重要的,是它支持Adobe自家的Flash Media Server的实时流和点播流。
Flash Media Server(以下简称FMS)是一个重量级的产品,它在AS 1.0/2.0时代就推出了。FMS最初叫做Flash Communication Server(以下简称FCS),它当时是和(Flash MX/Flash MX 2004)|(Flash Player 6.0/7.0)|(AS1.0/2.0)配合使用的。
上面一段的括号、斜杠、分隔符很多,如果看不懂,可以先看这篇文章:
Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系
不要怪我,Adobe的产品线确实就是如此的混乱(这和收购Macromedia无关)。
FMS是个服务器,它的升级不可能与Flash Player这个客户端同步。这就导致了可能出现Flash 6/AS1的客户端程序连接目前最新的FMS 5.0服务器的情况;当然也可能会出现Flash 11.5/AS 3.0客户端程序连接FCS 1.5的情况。为了保证语法一致性和向下兼容,Adobe估计就只能在NetStream这个特殊的类上保持这种特殊的语法了。
其实这种语法也不算怎么“特殊”。同样的情况也还发生在NetConnection类上。可以参考NetConnection的client属性和call方法:
为了向下兼容,AS3 的继承机制本来就是两套:固定属性继承和原型(prototype)继承。client这种特殊对象的存在,在原型继承的基础上是很合理的。可以参考这里:
况且,FMS中使用的语言是Javascript。Javascript采用的是原型继承。所以对于一个服务器端和客户端都要使用的功能/类/方法,而且要兼顾客户端的AS1/AS2/AS3的变迁,采用这种方式应该是再合理不过。
以上全是我的猜测。可能不正确。
知乎好像有几位Adobe员工,正确答案你可以问问他们。
附:FMS中的NetStream、Stream、NetConnectioin、Client
- http://help.adobe.com/en_US/adobemediaserver/ssaslr/WS5b3ccc516d4fbf351e63e3d11a11afc95e-7e42SSASLR.2.3.html#WS5b3ccc516d4fbf351e63e3d11a11afc95e-7f38SSASLR.2.3
- http://help.adobe.com/en_US/adobemediaserver/ssaslr/WS5b3ccc516d4fbf351e63e3d11a11aff5ba-7d13SSASLR.2.3.html
- http://help.adobe.com/en_US/adobemediaserver/ssaslr/WS5b3ccc516d4fbf351e63e3d11a11afc95e-7ec3SSASLR.2.3.html
- http://help.adobe.com/en_US/adobemediaserver/ssaslr/WS5b3ccc516d4fbf351e63e3d11a11afc95e-7e76SSASLR.2.3.html#WS5b3ccc516d4fbf351e63e3d11a11afc95e-7f6fSSASLR.2.3
- 文章ID:1796
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/why-using-onmetadata-oncuepoint-in-as3/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。