8

私は RESTful API を使用しており、Javascript コードは jQuery の $.ajax() 呼び出しを介して REST クエリを作成しています。

以下に示すように、javascript Rest クラスを実装しました (大幅に簡略化されています)。

var Rest = function (baseUrlPath, errorMessageHandler) {
        ...
    };

// Declare HTTP response codes as constants
Rest.prototype.STATUS_OK = 200;
Rest.prototype.STATUS_BAD_REQUEST = 400;

... // other rest methods 

Rest.prototype.post = function (params) {
        $.ajax({
            type: 'POST',
            url: params.url,
            data: params.data,
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            beforeSend: this._authorize,
            success: params.success,
            error: params.error || this._getAjaxErrorHandler(params.errorMessage)
        });
        };

... // more rest methods

Rest.prototype.executeScenario = function (scenarioRef) {
        var self = this;

        this.post({
            url: 'myurlgoeshere',
            data: 'mydatagoeshere',
            success: function (data, textStatus, xhr) {
                if (xhr.status == 200) {
                    console.log("everything went ok");
                }
            },
            error: function (xhr, textStatus, errorMsg) {
                // TODO: constants
                if (404 == xhr.status) {
                    self.errorMessageHandler("The scenario does not exist or is not currently queued");
                } else if (403 == xhr.status) {
                    self.errorMessageHandler("You are not allowed to execute scenario: " + scenarioRef.displayName);
                } else if(423 == xhr.status) {
                    self.errorMessageHandler("Scenario: " + scenarioRef.displayName +  " is already in the queue");
                }
            }
        });
    };

コードは意図したとおりに機能しますが、コードを美しくして読みやすさを向上させるために、いくつかの定数を追加することにしました。たとえば、コード内に xhr.status == 200 または xhr.status == 400 などをチェックしている場所がいくつかあります。

クラス変数を次のように宣言できますRest.prototype.STATUS_OK = 200;

しかし、変数は編集可能であり、定数にする方法が思いつきません。たとえば、私のコードではthis.STATUS_OK = 123;、変数を変更することができます。const キーワードをいじってみましたが、うまくいきませんでした。

私はこれを見ました:クラス定数を宣言する場所は?、しかし、それはあまり役に立ちませんでした。

これらのフィールドを変数ではなく定数リテラルにする方法について、誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

2

これは Javascript では不可能です。おそらくできる最善のことは、次のようなクロージャーを作成することです。

var StatusCode = (function() {
    var STATUS_OK = 200,
        STATUS_BAD_REQUEST = 400;

    return {
        getOk: function() {
            return STATUS_OK;
        },
        getBadRequest: function() {
            return STATUS_BAD_REQUEST;
        }
    }

});

のように使用しStatusCode.getOk() === 200ます。これは、これらの「定数」を変更できないようにするのに役立ちますが、読みやすさが低下します (これはおそらく意見に基づいています)。これらの定数はすべて大文字のままにして、定数としてマークしますが、変更することはできます。

于 2013-07-25T13:29:30.010 に答える
0

Javascript には、不変の定数を作成するための適切なサポートがありません。一部のブラウザーでは機能しないため、constキーワードもお勧めしません。

私はそれを行う最良の方法は次を使用していると思いますObject.freeze

Rest.Status = {};
Rest.Status.Ok = "Ok";
Object.freeze(Rest.Status);

Object.freeze は、Status オブジェクトの変更を黙って無視します。例:

Rest.Status.Ok = "foo";
Rest.Status.Ok; //=> "Ok"

ただし、ECMAScript 5 以降でのみ動作します。

上記ではステータスをオブジェクトに配置しました。プロトタイプはインスタンス メソッド、プロパティなどにより近いため、Statusより興味深いと思います。ステータス オブジェクトは列挙のように見えます。prototype

于 2013-07-25T13:51:29.440 に答える