我看到人们以两种方式声明函数:
1.
application.onConnect = function(clientObj, uid,gameName) {
clientObj.functionname= function() { ... }
}
2.
Client.prototype.functionName = function() { ... }
有什么不同 ?
我看到人们以两种方式声明函数:
1.
application.onConnect = function(clientObj, uid,gameName) {
clientObj.functionname= function() { ... }
}
2.
Client.prototype.functionName = function() { ... }
有什么不同 ?
前面的答案不完整。
第一个示例仅向客户端类的特定实例添加方法。第二个示例将方法添加到所有 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 放在里面,你可以想象一个恶意的人可以伪造一个客户端,允许他断开你的任何用户。
我希望这有帮助。
第一个示例将函数添加到创建的客户端对象。
第二个示例将函数添加到将在发出 onConnect 时创建的类的原型中。
所以实际上这是达到相同结果的两种方法。
如果我不得不猜测什么更快,我猜使用第二个示例会更快一些,因为您将函数添加到类定义中。