属性 es6 中的验证 类

Property validation in es6 classes

我需要先验证属性,然后再在我的 class 中设置它们。我已经为 class 中的每个 属性 定义了 setter 方法,如下所示:

class SetterDemo {
    constructor(document) {
        this.document = {
            _type: 'SetterDemo'
        };
        this.document.prop1 = document.prop1;
    }
    get prop1() {
        return this.document.prop1;
    }
    set prop1(value) {
        //validating data. This is just an example. My validations will be a lot complex
        if (!value) {
            throw 'Invalid data';
        }
        this.document.prop1 = value;
    }
}

只要我这样做就可以很好地工作:

let instance1 = new SetterDemo({prop1: 'abc'});
instance1.prop1 = null; //Throws error. Good. Just like I want it to.

但是当我这样做时:

let instance2 = new SetterDemo({prop1: null});

它正在创建一个没有抛出错误的实例。我希望它抛出错误,因为 "prop1" 无效。似乎没有在构造函数中调用 prop1 的 setter 方法。有没有办法在构造函数中使用 setter 方法?或者有没有一种方法可以在我的 setter 方法和构造函数中使用通用验证器函数?

注意: 我尝试在 class 之外创建一些验证器函数,并在 setter 和构造函数中使用它们。这就像我想要的那样工作,但它似乎不是正确的方法。这是它的代码:

class SetterDemo {
    constructor(document) {
        this.document = {
            _type: 'SetterDemo'
        };
        if (!validateProp1(document.prop1)) {
            throw 'Invalid data';
        }

        this.document.prop1 = document.prop1;
    }
    get prop1() {
        return this.document.prop1;
    }
    set prop1(value) {
        if (!validateProp1(value)) {
            throw 'Invalid data';
        }
        this.document.prop1 = value;
    }
}

module.exports = SetterDemo;

// -- Private Functions -- //
//validator function for prop1
function validateProp1(value) {
    if (!value) {
        return false;
    } else {
        return true;
    }
}

问题出在这一行

this.document.prop1 = document.prop1;

它需要改为

this.prop1 = document.prop1;

发生的事情是您绕过了构造函数中的 setter。