fms:client.prototype.function和clientObj.function()之间有什么区别?

时间:2009-12-28 13:19:46

标签: flash-media-server fms3

我看到人们以两种方式宣布功能:

1

application.onConnect = function(clientObj, uid,gameName) { 

   clientObj.functionname= function() { ... }

}

2

Client.prototype.functionName = function() { ... } 

有什么区别?

2 个答案:

答案 0 :(得分:2)

之前的答案不完整。

第一个示例仅为客户类的特定实例添加方法。 第二个例子为所有Class原型添加了方法。

这种区别对于某些用例非常重要。

例如,如果连接到房间的客户端具有由您的逻辑创建的管理权限,则在onConnect的客户端实例中,您将仅向管理员的用户客户端添加方法,否则在每个管理方法中,您将需要检查客户端是否为管理员或不(这将是丑陋的)

样品:

application.isAdminUser = function(cParams) {
   if (cParams.username == 'admin') {
       return true;
   } else {
       return false;
   }
}

/* bad - people can simulate clients */
application.onConnect = function(client, cParams) {
   client.disconnectUser = function(userId) { application.myDisconnect(userId); };
   client.allClientsMethod = function() { };
}

/* good */
application.onConnect = function(client, cParams) {
   if(this.isAdminUser(cParams)) {
       client.disconnectUser = function(userId) { application.myDisconnect(userId); };
   }
   // this following is applied to all connecting clients
   client.allClientsMethod = function() { };
   // and can be done also by:
   // Client.prototype.allClientsMethod = function() { };
}

如果您没有将disonnectUser放入其中,如果您可以想象恶意的人可以伪造一个允许他断开您的任何用户的客户端。

我希望这会有所帮助。

答案 1 :(得分:1)

第一个示例将函数添加到已创建的客户端对象。

第二个示例将函数添加到将在发出onConnect时创建的类的原型。

所以实际上它有两种方法可以达到相同的效果。

如果我不得不猜测什么更快,我猜想使用第二个例子会更快一些,因为你将函数添加到类定义中。