1

我看到人们以两种方式声明函数:

1.

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

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

}

2.

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

有什么不同 ?

4

2 回答 2

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 放在里面,你可以想象一个恶意的人可以伪造一个客户端,允许他断开你的任何用户。

我希望这有帮助。

于 2010-03-02T13:23:37.187 回答
1

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

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

所以实际上这是达到相同结果的两种方法。

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

于 2009-12-30T13:01:08.573 回答