javascript - setter 中的值检查

标签 javascript oop ecmascript-6

是否可以在 es6 类属性 setter 中实现值验证? 愚蠢的尝试失败了,并出现 Uncaught RangeError:超过了最大调用堆栈大小,正如预期的那样:

class Something {
    constructor() {
        this.maxRange = 5;
        this.minRange = 1;
        this.selectedRange = 3;
    }
    set selectedRange(value) {
        if (value <= this.maxRange && value >= this.minRange) {
            this.selectedRange = value;
        }
    }
}

但是什么是正确的方法呢?有可能在 setter 中完成吗? (不使用 setPropsetRange 等附加方法)

最佳答案

据我所知(请随时纠正我),您不能将 setter(或 getter)与常规值混合。常规值将被覆盖。

Getters and setters are a part of accessor descriptors and regular values are a part of data descriptors.

您需要同时使用 setter 和 getter,并定义一个内部属性(例如使用下划线 _),该属性由 getter 获取并由 setter 写入。

class Something {
    constructor() {
        this.maxRange = 5;
        this.minRange = 1;
        this._selectedRange = 3;
    }
    get selectedRange() {
        return this._selectedRange;
    }
    set selectedRange(value) {
        if (value <= this.maxRange && value >= this.minRange) {
            this._selectedRange = value;
        }
    }
}

您甚至可以使内部属性不可枚举,这样它就不会出现在循环中:

class Something {
    constructor() {
        this.maxRange = 5;
        this.minRange = 1;
        Object.defineProperty(this, '_selectedRange', {
            value: 3,
            configurable: true,
            writable: true,
            enumerable: false
        });
    }
    get selectedRange() {
        return this._selectedRange;
    }
    set selectedRange(value) {
        if (value <= this.maxRange && value >= this.minRange) {
            this._selectedRange = value;
        }
    }
}

关于javascript - setter 中的值检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787175/

相关文章:

java - 如何在 Java 中使用用户输入引用类型、对象名称和参数在运行时创建对象

javascript - 当我在 ES6/react 中使用它时,moment.tz() 失败了吗?

javascript - 两个问题 : this. 方法不是函数 - addEventListener 添加的单击事件在用户单击时运行超过 20 次

javascript - 如何从 CSS 类属性创建变量?

c# - 使用字符串值创建新实例

javascript - 单击时如何选择(此)图像?

javascript - 为什么我在行驶路线时收不到数据?

javascript - 如果可迭代参数是生成器函数,则 Yield* 构造 "jumps a value"

javascript - 在 Plotly 中取消绑定(bind)点击事件

javascript - Backbone JS单页应用文件上传?