Javascript原型常量声明

前端之家收集整理的这篇文章主要介绍了Javascript原型常量声明前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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,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;

但变量是可编辑的,我想不出如何使它们保持不变.例如,在我的代码中,我可以执行此操作.STATUS_OK = 123;这将修改变量.我玩过const关键字,没有运气.

我见过这个:Where to declare class constants?,但没有多大帮助.

有人能指出我正确的方向,如何使这些字段成为常量文字而不是变量?

解决方法

使用ECMAScript 5的 Object.defineProperty,您可以使值不可设置:
Object.defineProperty(Rest,"STATUS_OK",{
  enumerable: false,// optional; if you care about your enumerated keys
  configurable: false,writable: false,value: 200
});

或者,由于这些是默认值,只需执行以下操作:

Object.defineProperty(Rest,{ value: 200 });

这使得Rest.STATUS_OK在访问时产生200,但它不会响应重新定义或删除它的尝试.此外,configurable:false将阻止任何尝试使用后续的defineProperty调用重新定义属性.

但是,这在older browsers that don’t support ES5’s defineProperty(尤其是IE8及以下版本)中不起作用.

猜你在找的JavaScript相关文章