2017-04-24 12 views
0

プロパティをクラスに設定する前に検証する必要があります。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 instance2 = new SetterDemo({prop1: null}); 

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

をしかし、私はこれを行うとき、

エラーをスローせずにインスタンスを作成しています。 "prop1"が無効なので、エラーをスローするようにします。そのprop1のセッターメソッドがコンストラクターで呼び出されていないようです。コンストラクタで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の外部検証は完全にうまく、一貫性があります。あなたのバグは、コンストラクタでセッターをバイパスしているということです。 –

+0

@AluanHaddad、あなたのコメントは私が探していたものです。それは私の心を越えましたが、私は確信が持たれておらず、実験していましたが、現在は期待どおりに働いています。ありがとうございました。私はそれを正しいものとして受け入れることができるように、あなたのコメントを回答として投稿してください。 –

答えて

1

問題は、このライン

this.document.prop1 = document.prop1; 

である、それは代わりに何が起こっている

this.prop1 = document.prop1; 

にする必要があるあなたがセッターをバイパスしているということですコンストラクタ。