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

留言