【发布时间】:2017-04-24 06:50:28
【问题描述】:
我需要先验证属性,然后再在我的班级中设置它们。我已经为类中的每个属性定义了 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 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;
}
}
【问题讨论】:
-
else if (value.prop1 === null ) { throw "Err."; }我想你需要添加这个 -
这一行是问题所在:
this.document.prop1 = document.prop1;它必须是this.prop1 = document.prop1;。 FWIW 外部验证完全没问题,只要保持一致即可。您的错误是您正在绕过构造函数中的设置器。 -
@AluanHaddad,您的评论正是我想要的。它已经在我的脑海中闪过,但我不确定并且正在对其进行试验,现在它正在按预期工作。谢谢你。请发表您的评论作为答案,以便我接受它作为正确的答案。
标签: javascript constructor ecmascript-6 setter es6-class