我正在使用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及以下版本)中不起作用.