

下記のコードでプロパティの値は`5`に変わりません：

[code]

    class TestClass{
    
      constructor(prop){
        this.prop = prop;
        TestClass.validateProp(prop); // 例えばpropは整数で、最小値は５でなければなりません
        console.log(this.prop)
      }
    
      static validateProp(prop){
        // 仮にこれは不正だとします
        this.prop = 5; // 最小値に設定
      }
    
    }
    
    let testInstance = new TestClass('不正値');
    
[/code]

もしかして、ゲッター・セッターが必要かもしれません。インタネットで例の数は少なく、ゲッター・セッターの宣言で終わる事が多いです。[こちら](http://memolu.hatenablog.com/entry/2016/07/06/005006)の投稿を基にして、上記のコードにゲッターとセッターを追加しましたが、`prop`は`5`に成っていないままです。

[code]

    class TestClass{
    
      constructor(prop){
    
        this.prop = prop;
        TestClass.validateProp(prop); // 例えば最小値は５でなければなりません
        console.log(this.prop)
    
      }
    
      set prop(newValue){
        this._prop = newValue;
      }
    
      get prop(){
        return this._prop;
      }
    
      static validateProp(prop){
        // 仮にこれは不正だとします
        this.prop = 5; // 最小値に設定
      }
    }
    
    let testInstance = new TestClass('不正値');
    
[/code]

どうすればよろしいでしょうか。

（上記の例には、規定値が役に立ちますが、この質問の中心はクラスの中にプロパティを変更する事ですから、規定値を置いてください）


CC BY-SA 3.0
2017-10-27T02:19:07.543
39064
2018-09-15T03:56:33.190
16876
question
javascript ecmascript-6 es6
ES6: クラスの中でプロパティを変更する方法


オブジェクト指向プログラミングをサポートしている言語は、どの言語でも、静的メソッドからインスタンスを参照できません。質問にある例だと、もっとも簡単な解決策は`validateProp`メソッドを非静的メソッドにする方法です：

[code]

    class TestClass{
    
      constructor(prop){
        // ちなみに、パラメターを使ってからこれをバリデーションするのは変な書き方です
        this.prop = prop;
        this.validateProp(prop); 
      }
    
      validateProp(prop){
        // ...
        this.prop = 5;
      }
    }
    
[/code]

静的メソッドにこだわりがあれば：

[code]

    class TestClass{
    
      constructor(prop) {
            // 動いていますが、無駄なコードが多い
            if (!TestClass.isPropertyValid(prop)) {
                prop = 5;
            }
            this.prop = prop;
      }
    
      static isPropertyValid(prop){
        return prop >= 5;
      }
    }
    
[/code]

この例の一番簡潔な書き方：

[code]

    class TestClass{
      constructor(prop) {
            this.prop = prop >= 5 ? prop : 5;
      }
    }
    
[/code]


CC BY-SA 4.0
2018-09-13T14:25:11.507
48370
2018-09-13T15:15:48.360
2018-09-13T15:15:48.360
19110
16876
39064
answer


getter, setter を使うなら、値を共有する優れた手段(private property)が標準に存在しない事が問題になります。

[code]

    'use strcit';
    const TestClass = (() => {
      const wm = new WeakMap;
    
      return class TestClass {
        constructor (prop) {
          wm.set(this, Object.create(null));
          this.prop = prop;
        }
        get prop () {
          return wm.get(this).prop;
        }
        set prop (prop) {
          prop = Math.floor(prop);
          return wm.get(this).prop = prop < 5 ? 5 : prop;
        }
      }
    })();
    
    const test = new TestClass(2);
    console.log(test.prop); // 5
[/code]

Re: @Gurebu Bokofu


CC BY-SA 4.0
2018-09-15T03:56:33.190
48418
2018-09-15T03:56:33.190
20262
39064
answer