AS3.0监听视频的metaData和cuePoint时,使用了onMetaData()和onCuePoint()类AS2.0的形式,而没用addEventListener这种更”现代化”的形式,为什么?

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:AS3.0监听视频的metaData和cuePoint时,使用了onMetaData()和onCuePoint()类AS2.0的形式,而没用addEventListener这种更”现代化”的形式,为什么?
  • 本文链接:http://zengrong.net/post/1796.htm

这个问题是我在知乎上的一个回答: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方法:

http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/flash/net/NetConnection.html#client

为了向下兼容,AS3 的继承机制本来就是两套:固定属性继承和原型(prototype)继承。client这种特殊对象的存在,在原型继承的基础上是很合理的。可以参考这里:

http://help.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f3f.html

况且,FMS中使用的语言是Javascript。Javascript采用的是原型继承。所以对于一个服务器端和客户端都要使用的功能/类/方法,而且要兼顾客户端的AS1/AS2/AS3的变迁,采用这种方式应该是再合理不过。

以上全是我的猜测。可能不正确。

知乎好像有几位Adobe员工,正确答案你可以问问他们。

附:FMS中的NetStream、Stream、NetConnectioin、Client