Javascript 原型(prototype)常量声明

标签 javascript oop

我正在使用 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 关键字,但没有成功。

我看过这个: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, "STATUS_OK", { value: 200 });

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

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

关于Javascript 原型(prototype)常量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17859317/

相关文章:

javascript - 我应该在 promise 中调用 XMLHttpRequest async 吗?

java - 封装广义理论

java - 简单的笛卡尔坐标计算器

c# - 将 Generic<Derived> 转换为 Generic<Base>

oop - 闲聊中的矛盾

javascript - 存储动态创建的控件的值

javascript - Raphael.js 中的缩放和旋转

delphi - 如何一次将 "Sender"参数与 "As"运算符一起用于多个类?

Javascript - 如何将字符串拆分为嵌套数组?

Javascript promise 不明确