1

私は人々が2つの方法で関数を宣言するのを見ました:

1.

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

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

}

2.

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

違いは何ですか?

4

2 に答える 2

2

前の答えは不完全です。

最初の例では、Clientクラスの特定のインスタンスにのみメソッドを追加します。2番目の例では、すべてのクラスプロトタイプにメソッドを追加します。

この区別は、一部のユースケースでは非常に重要です。

たとえば、ルームに接続するクライアントがロジックによって作成された管理者権限を持っている場合、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

最初の例では、作成されたクライアント オブジェクトに関数を追加します。

2 番目の例では、onConnect が発行されたときに作成されるクラスのプロトタイプに関数を追加します。

実際には、同じ結果を得るには 2 つの方法があります。

何が速いかを推測する必要がある場合は、クラス定義に関数を追加するため、2 番目の例を使用すると少し速くなると思います。

于 2009-12-30T13:01:08.573 に答える