2017-11-28 22 views
2

デコレータはいつ実行されますか?typescript/jsデコレータが実行されるタイミング

class Person { 
    @SomeDecorator 
    age 
} 
  1. Personクラスは、静的プロパティに関する

何をして解析されたとき、私は人

  • のインスタンスを作成しますか?

  • +0

    静的クラスとは何ですか? – Bergi

    +0

    @Bergi Sry、静的なプロパティのデコレータ – Chris

    答えて

    1

    プロパティデコレータは、クラスが定義されているときに早期に実行されます。インスタンスを構築したり、プロパティにアクセスする必要はありません。

    例:これはPersonクラスが構築されていなくてもageを記録します。プロパティが静的である場合も同様です。

    function SomeDecorator(a, b) { 
        console.log(b); 
    } 
    
    class Person { 
        @SomeDecorator 
        public age: number; 
    } 
    

    プロパティのgetおよびsetアクションにフックインしている場合は、それも可能です。以下はPro TypeScript (Second Edition)のリストの例です。これはgetterとsetterをラップすることで機能します。

    function log(target: any, key: string) { 
        let value = target[key]; 
    
        // Replacement getter 
        const getter = function() { 
         console.log(`Getter for ${key} returned ${value}`); 
         return value; 
        }; 
    
        // Replacement setter 
        const setter = function (newVal) { 
         console.log(`Set ${key} to ${newVal}`); 
         value = newVal; 
        }; 
    
        // Replace the property 
        if (delete this[key]) { 
         Object.defineProperty(target, key, { 
          get: getter, 
          set: setter, 
          enumerable: true, 
          configurable: true 
         }); 
        } 
    } 
    
    class Calculator { 
        @log 
        public num: number; 
    
        square() { 
         return this.num * this.num; 
        } 
    } 
    
    console.log('Construct'); 
    const calc = new Calculator(); 
    
    console.log('Set'); 
    // Set num to 4 
    calc.num = 4; 
    
    console.log('Get'); 
    // Getter for num returned 4 
    // Getter for num returned 4 
    calc.square(); 
    

    このリストの出力は、次のとおりです。

    Construct (manual log) 
    
    Set (manual log) 
    
    -> Set num to 4 
    
    Get (manual log) 
    
    -> Getter for num returned 4 
    
    -> Getter for num returned 4 
    
    関連する問題