2017-04-24 75 views
0

我需要在將它們設置到我的課程之前驗證屬性。我已經定義爲類中的每個屬性的setter方法,如下圖所示:es6類中的屬性驗證

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方法和構造函數中使用通用的驗證器函數?

注:我已經嘗試在我的類之外創建一些驗證器函數,並在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; 
    } 
} 
+0

'else if(value.prop1 === null){throw「Err。」; }'我想你需要添加這個 – Jai

+0

這條線是問題:'this.document.prop1 = document.prop1;'它需要'this.prop1 = document.prop1;'。 FWIW外部驗證是完全正確的,只是一致。你的錯誤在於你正在構造函數中繞過setter。 –

+0

@AluanHaddad,你的評論是我一直在尋找的。它已經過了我的想法,但我不確定,並正在嘗試,現在它按預期工作。謝謝。請發表您的評論作爲答案,以便我可以接受它作爲正確的答案。 –

回答

1

問題是此行

this.document.prop1 = document.prop1; 

它需要改爲

this.prop1 = document.prop1; 

正在發生的事情是,你是繞過的二傳手構造函數。